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です。Googleにキャッシュされているため、低すぎると思います。これは本当ですか?また、URLのサイズを計算する他のサイトでGoogleをテストしましたが、2倍の大きさでした。

4

5 に答える 5

51

これに使えますCURLOPT_FRESH_CONNECT。からcurl_setopt

CURLOPT_FRESH_CONNECT TRUE を指定すると、キャッシュされた接続の代わりに新しい接続が強制的に使用されます。

curl_setopt($curl1, CURLOPT_FRESH_CONNECT, TRUE);

RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching and 5.2によると。キャッシュ制御

「Cache-Control」ヘッダー フィールドは、要求/応答チェーンに沿ったキャッシュのディレクティブを指定するために使用されます。

5.2.1. Request Cache-Control Directivesは、応答に対するキャッシュの使用を制御するためのいくつかのディレクティブを定義します。これらの1つは

5.2.1.4. キャッシュなし

「no-cache」リクエスト ディレクティブは、オリジン サーバーでの検証が成功しない限り、リクエストを満たすためにキャッシュが保存されたレスポンスを使用してはならないことを示します。

したがって、適切なヘッダーを設定する

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

有効で最新の応答が返されることを確認する必要があります。サーバーでの検証で許可されている場合、これでも応答がキャッシュされる可能性があることを理解しています。


ただし、5.2.2.1. must-revalidateは、リクエストへのレスポンスと一緒にサーバーによって与えられるResponse Cache-Control ディレクティブです。

[...] 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

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 に答える
3

に設定するCURLことで、新しいデータを使用するように指示できますCURLOPT_FRESH_CONNECTTRUE

CURLここで機能の詳細を読むことができます:

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

于 2013-03-19T07:35:03.983 に答える