首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony缓存HTTP已缓存控制:无缓存私有

Symfony缓存HTTP已缓存控制:无缓存私有
EN

Stack Overflow用户
提问于 2021-01-14 17:30:47
回答 1查看 167关注 0票数 0

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

代码语言:javascript
复制
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

代码语言:javascript
复制
$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
if ('prod' === $kernel->getEnvironment()) {
    $kernel = new CacheKernel($kernel);
}

但是不用工作,我只是有一个私有的缓存控制

我试着像你的链接一样把这个放到doctrine.yaml中:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
framework:
cache:
    pools: #        <==== new
        doctrine.result_cache_pool:
            adapter: cache.app
        doctrine.system_cache_pool:
            adapter: cache.system

在我的services.yaml中:

代码语言:javascript
复制
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项目中不起作用,谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-01-14 22:23:57

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

请查看此处的文档。

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

以下是关于在symfony2中使用它们的博客文章

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65716436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档