【问题标题】:Purge all files under a directory with Varnish HTTP accelerator使用 Varnish HTTP 加速器清除目录下的所有文件
【发布时间】:2012-11-14 21:53:52
【问题描述】:

是否可以使用 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);    
}

【问题讨论】:

    标签: php varnish varnish-vcl


    【解决方案1】:

    您可以在 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.hostreq.url 参数。如果您需要这种类型的解决方案,请告诉我。

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

    【讨论】:

      【解决方案2】:

      试试这个:

      // $version = VERSION_OF_VARNISH;
      $command = $version >= 3 ? "ban" : "purge";
      exec("$command req.http.host ~ $host && req.url ~ \"$pattern\"");
      

      【讨论】:

        猜你喜欢
        • 2013-11-20
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-31
        • 2011-01-01
        • 2014-06-03
        相关资源
        最近更新 更多