Symfony 缓存 HTTP 已经 cache-controle: no-cache private

Posted

技术标签:

【中文标题】Symfony 缓存 HTTP 已经 cache-controle: no-cache private【英文标题】:Symfony cache HTTP already cache-controle: no-cache private 【发布时间】:2021-04-19 07:43:51 【问题描述】:

我用 Symfony 4.4(FOSRestBundle,Postman)创建了一个 API,我想做一个缓存系统,但缓存控制已经没有缓存,私有。 我试试这个缓存系统https://symfony.com/doc/current/components/cache.html 在我的控制器中:

public function readAll(CacheInterface $cache, ProductRepository $productRepository, ParamFetcher $paramFetcher, PaginatorInterface $paginator)

    $list = $productRepository->findAll();
    $list = $cache->get('product_', function (ItemInterface $item) use ($list) 
        $item->expiresAfter(3600);
        return $list;
    );

有一些配置可以填充缓存,因为我的印象是它无论如何都可以工作,第二次请求的时间减少了,下面的时间也减少了。

奇怪的是,在 symfony 5 下的前一个项目中,具有相同功能的缓存可以工作。这可能来自 FosRestBundle 还是来自配置?

我见过其他缓存系统,但我只想缓存这个 $ list 变量,所以在我看来这个是最好的。

我也在 index.php 中尝试this:

$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
if ('prod' === $kernel->getEnvironment()) 
    $kernel = new CacheKernel($kernel);

但不工作,我只有一个私人缓存控制

我试着把它放在你的链接一样的教义.yaml 中:

doctrine:
dbal:
    url: '%env(resolve:DATABASE_URL)%'

    # IMPORTANT: You MUST configure your server version,
    # either here or in the DATABASE_URL env var (see .env file)
    #server_version: '13'
orm:
    #auto_generate_proxy_classes: true
    naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
    auto_mapping: true
    mappings:
        App:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Entity'
            prefix: 'App\Entity'
            alias: App

    # the standard distribution overrides this to be true in debug, false otherwise
    auto_generate_proxy_classes: false
    proxy_namespace: Proxies
    proxy_dir: '%kernel.cache_dir%/doctrine/orm/Proxies'
    default_entity_manager: default
    metadata_cache_driver:
        type: pool
        pool: doctrine.system_cache_pool
    query_cache_driver:
        type: pool
        pool: doctrine.system_cache_pool
    result_cache_driver:
        type: pool
        pool: doctrine.result_cache_pool
    connection: ~
    class_metadata_factory_name:  Doctrine\ORM\Mapping\ClassMetadataFactory
    default_repository_class:  App\Repository\ProductRepository
    hydrators:
        # ...
        # ...
    dql:
        # ...
    filters:
        # ...

在 cache.yaml 中:

framework:
cache:
    pools: #        <==== new
        doctrine.result_cache_pool:
            adapter: cache.app
        doctrine.system_cache_pool:
            adapter: cache.system

在我的 services.yaml 中:

doctrine.result_cache_provider: #        <==== new
    class: Symfony\Component\Cache\DoctrineProvider
    public: false
    arguments:
        - '@doctrine.result_cache_pool'
doctrine.system_cache_provider: #        <==== new
    class: Symfony\Component\Cache\DoctrineProvider
    public: false
    arguments:
        - '@doctrine.system_cache_pool'

我没有更多错误,没关系,但它仍然让我缓存控制:无缓存,私有 它给我带来了一些错误,但是我没有设法纠正它 但 Postman 返回 500 异常:服务“doctrine.orm.cache.provider.doctrine.system_cache_pool”依赖于不存在的服务“doctrine.system_cache_pool”。

然后还要在cache.yaml中配置缓存吗?像这样https://symfony.com/doc/current/cache.html#configuring-cache-with-frameworkbundle?

如果有人知道这个缓存系统,我会回答,因为我不明白为什么它在我的 symfony 4.4 项目中不起作用,谢谢。

【问题讨论】:

【参考方案1】:

从您放在这里的代码中,我认为您想为查询添加结果缓存,而不是为控制器添加结果缓存。

在此处查看文档。

https://symfony.com/doc/current/bundles/DoctrineBundle/configuration.html#caching-drivers

这是关于在 symfony2 中使用它们的博文

https://www.gregfreeman.io/2012/invalidating-the-result-cache-in-doctrine-symfony2/

【讨论】:

您好,谢谢@Max Malecki 的回答,我尝试在我的学说.yaml 中添加一些代码,但我暂时不工作。我编辑我的帖子 没有错误但缓存控制:无缓存,私有。文件夹 %kernel.cache_dir%/doctrine/orm/Proxies 使用 php 文件创建。我编辑我的帖子

以上是关于Symfony 缓存 HTTP 已经 cache-controle: no-cache private的主要内容,如果未能解决你的问题,请参考以下文章

如何在多个 Symfony 实例之间共享应用程序缓存(共享缓存池)?

Symfony Apache 2:无法创建缓存目录 /var/cache

Symfony 3.1 - 缓存和图像

Symfony2 学说清除缓存

Symfony 组件缓存框

Symfony2禁用缓存?