0

在 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 )。

4

0 回答 0