31

我正在尝试找出 url 的文件大小:

$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 大小的网站上测试了 google,它的大小是原来的两倍。

4

5 回答 5

51

你可以用CURLOPT_FRESH_CONNECT这个。从curl_setopt

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

curl_setopt($curl1, CURLOPT_FRESH_CONNECT, TRUE);

根据RFC 7234 - 超文本传输​​协议 (HTTP/1.1):缓存5.2。缓存控制

“Cache-Control”标头字段用于为请求/响应链中的缓存指定指令。

5.2.1。请求缓存控制指令定义了几个指令来控制响应缓存的使用。其中之一是

5.2.1.4。无缓存

“no-cache”请求指令指示缓存不得使用存储的响应来满足请求,而无需在源服务器上成功验证。

所以设置一个适当的标题

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

应确保将返回有效且最新的响应。我了解,如果服务器上的验证允许这样做,这仍可能导致缓存响应。


但是,5.2.2.1。must-revalidate是服务器给出的响应缓存控制指令以及对请求的响应

[...] 当且仅当未能验证对表示的请求可能导致不正确的操作(例如静默未执行的金融交易)时,服务器才应该使用 must-revalidate 指令。

于 2013-03-19T07:34:07.773 回答
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

于 2013-03-19T07:34:33.130 回答
11

避免缓存的最佳方法是将时间或任何其他随机元素应用于 url,如下所示:
$url .= '?ts=' . time();

所以例如,而不是让
http://example.com/content.php

http://example.com/content.php?ts=1212434353

于 2015-01-13T23:15:49.547 回答
3

您可以通过设置来告诉CURL使用新数据CURLOPT_FRESH_CONNECTTRUE

您可以在此处阅读有关CURL功能的更多信息:

http://php.net/manual/en/function.curl-setopt.php

于 2013-03-19T07:35:03.983 回答
3

使用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

这可以帮助你。

于 2013-03-19T07:52:39.073 回答