4

是否可以使用 Varnish 清除特定目录下的所有文件?你怎么能在 PHP 脚本中完成这个?

例如,如果 URL 包含路径/product/a-specific-product/,是否也可以清除诸如/product/a-specific-product/a-sub-page/?

我有以下函数用于清除 Varnish 3 中的特定 URL(类的一部分VarnishPurger()

public function executePurge()
{
    $purgeUrls = array_unique($this->purgeUrls);

    foreach($purgeUrls as $url)
    {
        $this->purgeUrl($url);
    }

    if (!empty($purgeUrls))
    {
        $this->purgeUrl(home_url());
    }        
}

protected function purgeUrl($url)
{
    $c = curl_init($url);
    curl_setopt($c, CURLOPT_CUSTOMREQUEST, 'PURGE');
    curl_exec($c);
    curl_close($c);    
}
4

2 回答 2

2

您可以在 Varnish 中创建一个自定义 PURGE 处理程序来处理正则表达式清除,例如,使用ban_url().

例如,在 PHP 中,当您想要清除时添加自定义 HTTP 标头以供 Varnish 发现。

curl_setopt($c, CURLOPT_HTTPHEADER, array('X-Purge-Regex-URL'));

然后在 vcl_recv() 添加

if (req.http.X-Purge-Regex-URL) {
  if (!client.ip ~ purge) {
    error 405 "Not allowed.";
  }
  ban_url(req.url);
  error 200 "Banned URL";
}

/product/a-specific-product/现在,当您对匹配正则表达式的所有内容发出清除时,包括/product/a-specific-product/a-sub-page/将被清除。

请注意,HTTP 主机被忽略,因此如果您正在运行虚拟主机并且只希望清除特定站点,则需要使用ban()req.http.host参数req.url。如果您需要这种类型的解决方案,请告诉我。

此外,如前所述,清除是正则表达式清除,因此清除/product将清除所有匹配的 URL product

于 2012-11-27T11:58:54.297 回答
0

尝试这个:

// $version = VERSION_OF_VARNISH;
$command = $version >= 3 ? "ban" : "purge";
exec("$command req.http.host ~ $host && req.url ~ \"$pattern\"");
于 2012-11-27T12:13:16.843 回答