Symfony 4 HTTP 缓存标头在探查器和浏览器中不同

Posted

技术标签:

【中文标题】Symfony 4 HTTP 缓存标头在探查器和浏览器中不同【英文标题】:Symfony 4 HTTP Cache Headers not same in profiler and browser 【发布时间】:2021-10-28 00:03:46 【问题描述】:

对于网站开发,我尝试使用 documentation 中描述的 Symfony 4 HTTP 缓存。

我在 index.php 中创建了一个 CacheKernel,如下所示:

namespace App;

use Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache;

class CacheKernel extends HttpCache



// index.php
$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
$kernel = new CacheKernel($kernel);
$request = Request::createFromGlobals();

在主页操作中:

$response->setPublic();
$response->setMaxAge(3600);
$response->headers->addCacheControlDirective('must-revalidate', true);

return $response;

在分析器中,标题是集合:

cache-control "max-age=3600, must-revalidate, public"

但是在浏览器中,标题不一样,我认为缓存没有存储:

缓存控制:max-age=0,必须重新验证,私有

您是否有一些想法可以理解为什么标头不同以及为什么缓存不起作用?

我如何确保缓存正常工作,是否有一些日志?

非常感谢您的帮助

【问题讨论】:

【参考方案1】:

我可能错了,因为它与您的实现有关,但是,如果您在 dev 环境中,缓存将被禁用。这样您就可以立即看到更改,而无需像旧版 Symfony 那样在每次编辑后手动清除缓存。分析器在prod 中显示您所期望的事实告诉我它正在工作并且由于在dev 中而被覆盖。

尝试切换到prod

查看X-Symfony-Cache 标头以获取有关调试信息 缓存命中和未命中

--https://symfony.com/doc/4.4/http_cache.html#expiration-caching

还有一个日志:

缓存内核有一个特殊的 getLog() 方法,它返回一个字符串 表示缓存层中发生的事情。在发展中 环境,用它来调试和验证你的缓存策略:

error_log($kernel->getLog());

--https://symfony.com/doc/4.4/http_cache.html#symfony-reverse-proxy

【讨论】:

以上是关于Symfony 4 HTTP 缓存标头在探查器和浏览器中不同的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 的探查器和内存分析工具 [关闭]

SQL 探查器和调优顾问

Symfony 3中http标头之间的冲突

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

symfony 不在标头中获取令牌

使用查询构建器和 Symfony 的预订系统