これは、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);
}