有没有一种方法可以告诉curl不使用缓存?

32

我正在尝试查找一个网址的文件大小:

$url1 = 'www.google.com';
$curl1 = curl_init();
curl_setopt($curl1, CURLOPT_URL, $url1); 
curl_setopt($curl1, CURLOPT_RETURNTRANSFER, TRUE);
curl_exec($curl1);
$file_size = curl_getinfo($curl1, CURLINFO_SIZE_DOWNLOAD ); 
$file_size_kb = $file_size / 1000;
echo $file_size_kb;
输出为43331。我认为这太低了,因为我有谷歌缓存。这可能是真的吗?另外我在一些其他计算URL大小的网站上测试了谷歌,结果是两倍大。
5个回答

57
你可以使用CURLOPT_FRESH_CONNECT来实现此功能。从curl_setopt中。

CURLOPT_FRESH_CONNECT TRUE表示强制使用新连接而不是缓存的连接。

curl_setopt($curl1, CURLOPT_FRESH_CONNECT, TRUE);

根据 RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching5.2. Cache-Control,"Cache-Control" 头字段用于指定请求/响应链上缓存的指令。 5.2.1. Request Cache-Control Directives 定义了一些指令来控制响应的缓存使用。其中之一是: 5.2.1.4. no-cache "no-cache" 请求指令表示缓存在未经源服务器成功验证的情况下不能使用已存储的响应来满足请求。
因此,通过设置适当的头文件来使……(原文不完整)
curl_setopt($curl1, CURLOPT_HTTPHEADER, array("Cache-Control: no-cache"));

应确保返回一个有效且最新的响应。我理解如果服务器验证允许,则可能仍会导致缓存响应。


然而,5.2.2.1. must-revalidate是服务器在响应请求时给出的响应缓存控制指令之一。引用块中提到,“必须重新验证”指令应该仅由服务器使用,如果不验证表示可能会导致错误操作(例如未执行的财务交易),则必须验证请求的表示。

1
不行 - 这还不足以拒绝缓存命中。你请求信息的服务器可能仍会回复 Cache-Control: public, s-maxage=600(或类似内容),无论连接是否是新的或重用的。 - qualbeen
1
不行 - 这只会创建一个新连接(这只会降低性能),并且当服务器缓存配置时,仍然会返回缓存页面。这是避免获取缓存页面的正确方法:curl_setopt($curl1, CURLOPT_HTTPHEADER, array("Cache-Control: no-cache, must-revalidate") - Sjoerd Linders

13

curl_setopt($curl1, CURLOPT_FRESH_CONNECT, 1); // 不使用缓存的URL版本

CURLOPT_FRESH_CONNECT TRUE to force use of a new connection instead of a cached one.

查看示例,请点击此处

您可以设置标题

$headers = array( 
                 "Cache-Control: no-cache", 
                ); 
curl_setopt($curl1, CURLOPT_HTTPHEADER, $headers);

这个链接可能对您有帮助 http://www.php.net/manual/en/function.curl-setopt.php#96903


1
谢谢!向外部服务器发送正确的缓存控制解决了我的问题。(新连接完全没有帮助)curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cache-Control: no-cache") - qualbeen

13

避免缓存最好的方法是将时间或其他随机元素应用到url中,像这样:
$url .= '?ts=' . time();

例如,不要使用
http://example.com/content.php
而是使用
http://example.com/content.php?ts=1212434353


这是唯一对我有效的解决方案。我们的网站在WAF后面。 - GerritElbrink

4

使用CURLOPT_FRESH_CONNECT - TRUE强制使用新连接,而不是缓存的连接。

示例:

<?php
    function check_url($url) {
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_HEADER, 1); // get the header
        curl_setopt($c, CURLOPT_NOBODY, 1); // and *only* get the header
        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); // get the response as a string from curl_exec(), rather than echoing it
        curl_setopt($c, CURLOPT_FRESH_CONNECT, 1); // don't use a cached version of the url
        if (!curl_exec($c)) { return false; }

        $httpcode = curl_getinfo($c, CURLINFO_HTTP_CODE);
        return ($httpcode < 400);
    }
?>

如需了解更多关于curl的详细信息,请访问http://php.net/manual/en/function.curl-setopt.php

希望这能对您有所帮助。


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接