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 回答