You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何激活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缓存。具体步骤如下:

  1. 配置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
  1. 修改入口文件,指定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;
};
  1. 清理旧的文件缓存
    删除项目中默认的文件缓存目录(通常为var/cache/{env}/http_cache/),避免旧缓存干扰后续测试。

原理说明

Symfony的HttpCache反向代理默认使用FilesystemStore,和你配置的app缓存是两个独立的缓存体系。因此仅配置app缓存为Redis不会影响HTTP反向代理的存储,必须显式为HTTP缓存指定Redis适配器,并在初始化HttpCache时传入对应的存储实例。

内容的提问来源于stack exchange,提问作者smarber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:06:31