0

背景情報:

  • オンラインのさまざまなソースから動的にいくつかのURLを収集しています。
  • HTMLページまたは画像の場合はURLのコンテンツを取得したいと思います。
  • 大きなファイル(ダウンロードzip、pdfなど)をロードしたくありません。ターゲットが私にとって面白くないことを理解するためだけです。

実際にコンテンツをフェッチする前に、PHPで応答のタイプ/フォーマットを確認する方法はありますか?(自分自身とターゲットサーバーのリソースと帯域幅を浪費しないようにするため)

get_headers()PHPのドキュメントで見つけましたが、関数が実際にコンテンツ全体をフェッチしてヘッダーを返すのか、それとも最初にコンテンツをダウンロードせずにサーバーからヘッダーのみを取得するのかはわかりません。また、取得するための解決策を見つけました。 CURLとfsocketopenのヘッダーですが、実際のコンテンツをロードせずに実行できるかどうかという疑問が残ります)

4

3 に答える 3

3

HTTP HEADリクエストを使用して、ヘッダーのみを取得してみてください。何かのようなもの:

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD');

または(マニュアルで推奨されていること):

curl_setopt($ch, CURLOPT_NOBODY, true);

(私はこれらのどちらもテストしていません。)

于 2013-02-13T22:03:41.733 に答える
1

そのためのPHP関数があります:

$headers=get_headers("http://www.amazingjokes.com/img/2014/530c9613d29bd_CountvonCount.jpg");
print_r($headers);

次を返します。

Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Date: Tue, 11 Mar 2014 22:44:38 GMT
    [2] => Server: Apache
    [3] => Last-Modified: Tue, 25 Feb 2014 14:08:40 GMT
    [4] => ETag: "54e35e8-8873-4f33ba00673f4"
    [5] => Accept-Ranges: bytes
    [6] => Content-Length: 34931
    [7] => Connection: close
    [8] => Content-Type: image/jpeg
)

この後、コンテンツタイプを簡単に取得できるはずです。

詳細はこちら(PHP.NET)

于 2014-03-11T22:45:37.893 に答える
0

これは、CURLOPT_WRITEFUNCTIONコールバック関数でcURLを使用するソリューションです。その中で、着信ヘッダーをチェックしてコンテンツタイプを見つけます。希望どおりでない場合は、cURLに中止するように指示するため、リクエストの本文を取得するのに時間を無駄にすることはありません。

$ch = curl_init('http://stackoverflow.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);

$data = '';
$haveHeader = false;

curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $chunk) use (&$haveHeader, &$data) {
    if (!$haveHeader && ($chunk == "\n" || $chunk == "\r\n")) {
        // detected end of header
        $haveHeader = true;
    } else if (!$haveHeader) {
        // detected content type
        if (preg_match('/content-type:\s*([^;]+)/i', $chunk, $matches)) {
            $contentType = strtolower($matches[1]);
            // check if content type is what we want
            if ($contentType != 'text/html' && strpos($contentType, 'image/') === false) {
                // tell curl to abort
                return false;
            }
        }
    } else {
        // append to data (body/content)
        $data .= $chunk;
    }

    return strlen($chunk);
});

if (curl_exec($ch)) {
    // use $data here
    echo strlen($data);
}
于 2013-02-13T23:31:59.750 に答える