<?php
function check_pages_exist($urls_checked) // これからチェックされるURL一覧を受け取る。
{
$handleArray=array(); // URL毎のハンドルを保存する配列を用意する。
$multiHandle=curl_multi_init(); // 平行チェックを統括するハンドルを用意する。
foreach ($urls_checked as $idx=>$url)
{
$singleHandle=curl_init($url); // URL毎にアクセスハンドルを用意する。
curl_setopt($singleHandle,CURLOPT_HEADER,false);
// アクセスの結果にヘッダーを返さないようにする。転送量の節約になる。
curl_setopt($singleHandle,CURLOPT_NOBODY,true);
// アクセスの結果にボディーを返さないようにする。転送量を大きく節約する。
// この設定はHTTPとHTTPSにHEAD方法を使用させます。
$handleArray[]=$singleHandle;
curl_multi_add_handle($multiHandle,$singleHandle);
// アクセスを実行される単独URLのハンドルを平行ハンドルに追加する。
}
$exists_idxs=array(); // 存在判定をされたURLの索引値を保存する配列を用意する。
do {
$status=curl_multi_exec($multiHandle,$active);
// 全URLに対し、同時アクセスを開始させます。
} while ($status == CURLM_CALL_MULTI_PERFORM); // ライブラリーがコールし続けてほしい場合はそうする。
while ($active && $status == CURLM_OK) // 活動中且つエラーなしの場合は遣りつづけます。
{
if (curl_multi_select($multiHandle)==-1) // 状態変化を待つ
continue; // タイムアウトの場合はリトライする
do {
$status=curl_multi_exec($multiHandle,$active);
// 全URLに対し、結果が出るまで続ける。
} while ($status == CURLM_CALL_MULTI_PERFORM);
}
foreach ($handleArray as $idx=>$singleHandle)
{
$httpstatus=curl_getinfo($singleHandle,CURLINFO_HTTP_CODE);
// HTTPのステータスコードを取得する。
if ($httpstatus==200)
$exists_idxs[]=$idx; // ステータスが200の物のみを記録する。
}
curl_multi_close($multiHandle);
// 前ハンドルをクローズする。
$results=array();
foreach ($urls_checked as $idx=>$url)
{
if (in_array($idx,$exists_idxs))
$results[]=$url; // 成功にアクセスできたURLのみを取り出す。
}
return $results;
}
// 以下は例です。
$urls_to_check=array(
"http://chtaiji.x.uniwits.com/cnncl/versn-mx9tr4/upload/header_img/t/l/fl/image.jpg",
"http://chtaiji.x.uniwits.com/category/%E6%95%99%E5%AE%A4%E6%A1%88%E5%86%85/13/",
"http://qaon.net/press/wp-content/uploads/2015/09/CannyEdgeInterpolation-297x300.gif",
"http://qaon.net/press/wp-content/uploads/2015/09/006.canny_edge_detection_nohysteresis_brightened-1024x681.gif",
......
......
);
$checkResults=check_pages_exist($urls_to_check);
print_r($checkResults);
?>