Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用cURL PHP清除清漆缓存与命令行cURL_Php_Caching_Curl_Varnish - Fatal编程技术网

使用cURL PHP清除清漆缓存与命令行cURL

使用cURL PHP清除清漆缓存与命令行cURL,php,caching,curl,varnish,Php,Caching,Curl,Varnish,我们目前在一台服务器上有多个虚拟主机。我试图通过PHP进行缓存清除,而不涉及exec命令。通过发出以下命令行命令,我可以清除Varnish缓存中的单个文件: curl -X PURGE -H "Host: domain.com" http://127.0.0.1/test.html 我正在尝试将此命令复制到PHP。我已生成以下内容: if (isset($_POST['PurgeURL'])) { $purgeurl = $_POST["PurgeURL"]; $varnish

我们目前在一台服务器上有多个虚拟主机。我试图通过PHP进行缓存清除,而不涉及exec命令。通过发出以下命令行命令,我可以清除Varnish缓存中的单个文件:

curl -X PURGE -H "Host: domain.com" http://127.0.0.1/test.html
我正在尝试将此命令复制到PHP。我已生成以下内容:

if (isset($_POST['PurgeURL']))
{
    $purgeurl = $_POST["PurgeURL"];
    $varnishurl = "http://127.0.0.1" . $purgeurl ;
    $varnishhost = 'Host: ' . $_SERVER['SERVER_NAME'];
    $varnishcommand = "PURGE";
    $curl = curl_init($varnishurl);
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $varnishcommand);
    curl_setopt($curl, CURLOPT_ENCODING, $varnishhost);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);
    $result = curl_exec($curl);
    curl_close($curl);
我正在发布
/test.html

我收到以下答复:

Error 200 Purged.

Purged.

Guru Meditation:

XID: 1728013370

Varnish cache server
但是文件不会被清除。有什么想法吗

以下是请求的清漆日志:

    0 Debug        - "VCL_error(200, Purged.)"
   28 SessionOpen  c 127.0.0.1 54437 :80
   28 ReqStart     c 127.0.0.1 54437 1728228985
   28 RxRequest    c PURGE
   28 RxURL        c /test.html
   28 RxProtocol   c HTTP/1.1
   28 RxHeader     c Host: 127.0.0.1
   28 RxHeader     c Accept: */*
   28 RxHeader     c Accept-Encoding: Host: domain.com
   28 VCL_call     c recv
   28 VCL_acl      c MATCH purge localhost
   28 VCL_return   c lookup
   28 VCL_call     c hash
   28 Hash         c /test.html
   28 Hash         c 127.0.0.1
   28 VCL_return   c hash
   28 VCL_call     c miss error
   28 VCL_call     c error deliver
   28 VCL_call     c deliver deliver
   28 TxProtocol   c HTTP/1.1
   28 TxStatus     c 200
   28 TxResponse   c Purged.
   28 TxHeader     c Server: Varnish
   28 TxHeader     c Content-Type: text/html; charset=utf-8
   28 TxHeader     c Retry-After: 5
   28 TxHeader     c Content-Length: 383
   28 TxHeader     c Accept-Ranges: bytes
   28 TxHeader     c Date: Wed, 08 Jan 2014 14:42:33 GMT
   28 TxHeader     c X-Varnish: 1728228985
   28 TxHeader     c Age: 0
   28 TxHeader     c Via: 1.1 varnish
   28 TxHeader     c Connection: close
   28 Length       c 383
   28 ReqEnd       c 1728228985 1389192153.441481352 1389192153.441616535 0.000058413 0.000074863 0.000060320
   28 SessionClose c error
   28 StatSess     c 127.0.0.1 54437 0 1 1 0 0 0 245 383

您没有发出正确的“主机:”HTTP头,因此我假设以下行之一存在问题:

$varnishhost = 'Host: ' . $_SERVER['SERVER_NAME'];

curl_setopt($curl, CURLOPT_ENCODING, $varnishhost);

请提供请求的varnishlog跟踪,以便查看Varnish实际收到的头。您是否确定它应该是
CURLOPT_编码
?在这种情况下,问题是$_服务器['SERVER_NAME']不包含适当的主机名,正如您在跟踪上看到的那样,CURLOPT_编码应该是CURLOPT_HTTPHEADER,但要传递的值不是字符串,而是要设置的HTTP头字段数组,格式为数组('Host:'。$\u SERVER['SERVER\u NAME'])