如何激活Symfony内部反向代理并仅使用Redis作为HTTP缓存存储?
问题:Symfony内部反向代理的HTTP缓存无法仅使用Redis存储
我希望Symfony应用使用内部反向代理的HTTP缓存,已通过以下配置开启HTTP缓存:
# config/packages/framework.yaml framework: http_cache: enabled: true debug: true trace_level: 'full'
并在控制器中添加了缓存注解:
// src/Controller/MyController.php final class MyController { #[Route('/articles', name: 'articles')] #[Cache(public: true, mustRevalidate: true, expires: 'tomorrow')] public function test(Request $request, TagAwareCacheInterface $cache, Environment $twig): Response { $page = $request->query->get('page', 1); $item = $cache->get("articles-page-{$page}", function(ItemInterface $item) use ($page, $twig) { if ($item->isHit()) { return $item->get(); } // 耗时的逻辑计算$content变量 // ... $item->set($content); return $item->get(); }); return new Response($item); }
目前控制器缓存已正常存储至文件系统,但我希望HTTP缓存仅存储到Redis服务器,于是添加了以下配置:
# config/packages/cache.yaml framework: cache: app: cache.adapter.redis default_redis_provider: redis://redis:6379
但该配置未达到预期效果,应用同时使用Redis和文件系统作为缓存。清空Redis后重新加载URL,发现应用仍在使用文件系统作为HTTP缓存。
入口文件配置如下:
// public/index.php require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; return function (array $context) { $kernel = new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); $cacheKernel = new Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache($kernel); return $cacheKernel; };
环境版本:"symfony/framework-bundle": "^6.1""predis/predis": "^2.0"
请问如何配置才能让HTTP缓存仅使用Redis存储?
解决方案
要让Symfony内部反向代理的HTTP缓存仅使用Redis,需要单独为HTTP缓存指定Redis适配器,而非仅配置默认的app缓存。具体步骤如下:
- 配置HTTP缓存专用的Redis池
在config/packages/cache.yaml中添加HTTP缓存的专属Redis适配器配置:
# config/packages/cache.yaml framework: cache: default_redis_provider: redis://redis:6379 app: cache.adapter.redis # 新增HTTP缓存专用的Redis适配器 http_cache: adapter: cache.adapter.redis provider: '@default_redis_provider' # 复用默认Redis连接,也可直接写redis://redis:6379
- 修改入口文件,指定HTTP缓存使用Redis存储
默认的HttpCache类默认使用文件系统存储,需手动指定Redis存储实例。修改public/index.php:
// public/index.php require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; return function (array $context) { $kernel = new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); // 从容器中获取HTTP缓存专用的Redis存储实例 $cacheStore = $kernel->getContainer()->get('cache.http_cache'); // 初始化HttpCache时传入该存储实例 $cacheKernel = new Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache($kernel, $cacheStore); return $cacheKernel; };
- 清理旧的文件缓存
删除项目中默认的文件缓存目录(通常为var/cache/{env}/http_cache/),避免旧缓存干扰后续测试。
原理说明
Symfony的HttpCache反向代理默认使用FilesystemStore,和你配置的app缓存是两个独立的缓存体系。因此仅配置app缓存为Redis不会影响HTTP反向代理的存储,必须显式为HTTP缓存指定Redis适配器,并在初始化HttpCache时传入对应的存储实例。
内容的提问来源于stack exchange,提问作者smarber
相关产品推荐
相关产品推荐

