Php 清漆不';不带过期标头的t缓存
在我的服务器上,Varnish(缓存)在端口80上运行,Apache在8080上运行。Php 清漆不';不带过期标头的t缓存,php,caching,cache-control,varnish,Php,Caching,Cache Control,Varnish,在我的服务器上,Varnish(缓存)在端口80上运行,Apache在8080上运行。 当我设置如下标题时,Varnish缓存非常好: $this->getResponse()->setHeader('Expires', '', true); $this->getResponse()->setHeader('Cache-Control', 'public', true); $this->getResponse()->setHeader(
当我设置如下标题时,Varnish缓存非常好:
$this->getResponse()->setHeader('Expires', '', true);
$this->getResponse()->setHeader('Cache-Control', 'public', true);
$this->getResponse()->setHeader('Cache-Control', 'max-age=2592000');
$this->getResponse()->setHeader('Pragma', '', true);
但这意味着人们会缓存我的网站,而不会在其可用时检索新版本。当我删除标题时,人们会在每次重新加载页面时检索新版本(因此Varnish从不缓存) 我不知道这里出了什么问题。
我的理想情况是,人们不在客户端缓存html,而是将其留给Varnish处理。最简单的方法就是将最大年龄调低到更合理的程度。目前,您已将其设置为30天。尝试将其设置为15分钟:
$this->getResponse()->setHeader('Cache-Control', 'max-age=900');
Web缓存是一个有点复杂的主题,一些非常不同的客户端解释加剧了这一问题。但一般来说,这将减轻web服务器上的负载,同时确保新内容在合理的时间范围内可用
我的理想情况是,人们不在客户端缓存html,而是将其留给Varnish
您想要的是varnish缓存资源并将其提供给客户端,并且仅在发生更改时生成新版本。最简单的方法是让varnish将其缓存很长一段时间,并在发生更改时使varnish中的条目无效(使用PURGE命令)
默认情况下,varnish将根据后端提供的头建立其缓存规则。因此,如果您的php代码生成了您描述的标题,那么默认的varnish vcl将相应地调整其缓存策略。但是,它只能以通用的、安全的方式执行此操作(例如,如果您使用cookie,它将永远不会缓存)。您知道后端是如何工作的,您应该更改varnish的缓存行为,而不是从后端发送不同的头,而是编写一个varnish.vcl文件。您应该告诉varnish将资源缓存很长一段时间,即使Max Age头的缓存控制丢失(在.vcl文件中设置TimeToLive ttl)。Varnish随后将为生成的条目提供服务,直到ttl通过或清除该条目
如果您已经做到了这一点,那么还有一个更高级的选项:在客户机上缓存资源,但让客户机在每次想要使用它时对其进行“重新验证”。浏览器通过HTTP GET plus头(您的响应应包括引发其行为的头)或头(您的响应应包括引发其行为的头)执行此操作。这节省了bandwith,因为varnish可以使用响应进行响应,而无需再次发送整个资源 将客户端缓存的标准HTTP头设置为您想要的任何内容。设置一个只有Varnish才能看到的自定义标题,例如
X-Varnish-TTL
,然后在VCL中,将以下代码合并到VCL\u fetch
子文件中:
if (beresp.http.X-Varnish-TTL) {
C{
char *ttl;
/* first char in third param is length of header plus colon in octal */
ttl = VRT_GetHdr(sp, HDR_BERESP, "\016X-Varnish-TTL:");
VRT_l_beresp_ttl(sp, atoi(ttl));
}C
unset beresp.http.X-Varnish-TTL; // Remove so client never sees this
}