Php 清除清漆缓存中的失败

Php 清除清漆缓存中的失败,php,caching,varnish,Php,Caching,Varnish,我正在使用以下代码清除网站主页: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.mysite.com:8080/"); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PURGE"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch,

我正在使用以下代码清除网站主页:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://www.mysite.com:8080/");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PURGE");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 1000);

$r = curl_exec($ch);

echo "<PRE>$r</PRE>";

curl_close($ch);
所以现在我认为它被清除了,但是进一步调用页面检查标题表明它没有被清除。因为
Age:15
X-Cache:HIT
都已设置,这表明页面仍在缓存中,并且已经15秒了

TTL为120

我错过什么了吗

谢谢
杰克

我想评论一下,你应该发布你的default.vcl文件,但我的声誉太低了


清除是在您的vcl文件中实现的(或者,如果您希望它工作,至少应该实现),代码中有它的作用和不作用。它可能会阻止基于您连接的ip地址的清除,或者它可能无法实现。

我认为您不会在default.vcl中检查清除 default.vcl应包含以下内容:

acl purge {
        "localhost";
        "192.168.55.0"/24;
}

sub vcl_recv {
        # allow PURGE from localhost and 192.168.55...

        if (req.request == "PURGE") {
                if (!client.ip ~ purge) {
                        error 405 "Not allowed.";
                }
                return (lookup);
        }
}

sub vcl_hit {
        if (req.request == "PURGE") {
                purge;
                error 200 "Purged.";
        }
}

sub vcl_miss {
        if (req.request == "PURGE") {
                error 200 "OK but nothing to purge - URL was not in cache";
        }
}

为了消除所有其他php/curl问题,我将从最基本的低级检查开始

这对我很有用:

netcat -C varnish_hostname 80 <<EOF
PURGE /the/url
Host: hostname

EOF

netcat-C varnish\u主机名80只需知道,清除在beReq上起作用

如果修改req.url(即为URI添加前缀或后缀),则应在调用purge的vcl_recv中执行相同操作。
或者,在url操作后,您必须在主vcl_recv内写入清除条件。

您可以尝试监视
varnishlog
输出吗?检查两种情况下的
VCL\u调用、VCL\u返回和在RxHeader之后散列
,退出X缓存:未命中。:8080是要清除的URL的一部分吗?您需要区分varnish服务器的URL和要清除的URL。我将添加一个可能的答案来说明这一点。就在那里,我只是使用了记录在案的建议。当我得到预期的响应时,它一定在工作。
HTTP/1.1200清除。
得到预期响应的原因是vcl\u miss和vcl\u hit做了相同的事情。如果URL不在缓存中,或主机名不匹配,或URL拼写错误等,则会得到误导性的“清除”响应。我编辑了@deep answer,以便在vcl_未命中案例中做出更正确的响应。现在这个例子对我很有用。
netcat -C varnish_hostname 80 <<EOF
PURGE /the/url
Host: hostname

EOF