在 Varnish 中可以使用 ESI 标签为页面上的多个部分提供不同的缓存时间。
使用清漆4
例如:index.php
<html>...
<?php
// Cached as normal in Varnish ( 120 seconds)
echo " Date 1 (cached): ".date('Y/m/d H:i:s') ."\n";
?>
<esi:include src="inc/sidebar.php"/>
<esi:remove>
<?php include('inc/sidebar.php'); ?>
<p>Not ESI!</p>
</esi:remove>
边栏.php
<?php
echo "<br>NOT CACHED : ".date('Y/m/d H:i:s');
?>
配置清漆(default.vcl)
sub vcl_backend_response {
set beresp.do_esi = true;
## if sidebar remove cache else 120 seconds cache
if (bereq.url ~ "sidebar.php") {
## set beresp.ttl = 0s;
set beresp.uncacheable = true;
return(deliver);
} else {
set beresp.ttl = 120s;
}
以上工作正常,但我很想从我的项目中找到一种方法来控制它。如果我得到很多 ESI 文件,这个配置文件会变得很大。
我想过这个:
在index.php 中,作为第一件事:
<?php
header('Cache-Control: max-age=120');
?>
在sidebar.php中
<?php
header('Cache-Control: max-age=0');
echo "<br>NOT CACHED : ".date('Y/m/d H:i:s');
?>
在配置中( default.vcl )
import std;
sub vcl_backend_response {
set beresp.do_esi = true;
# Set total cache time from cache control or 120 seconds.
set beresp.ttl = std.duration(regsub(beresp.http.Cache-Control, ".*max-age=([0-9]+).*", "\1") + "s", 120s);
## Debug , shows up in header.
set beresp.http.ttl =beresp.ttl;
}
现在这部分工作..如果我只在 index.php 中放入标头 max-age ,它将控制该页面被缓存的时间。最大的问题是 sidebar.php ( max-age=0 ) 会覆盖所有内容,因此不会缓存整个页面。
有谁知道解决方案.. 重要的是从 php 脚本中控制缓存时间( beresp.ttl )。