PHP cURL 拡張機能を使用します。fopen() とは異なり、URL の可用性を確認するのに十分な HTTP HEAD リクエストを作成することもできます。確認のためにページの本文全体をダウンロードする必要がないため、大量の帯域幅を節約できます。
出発点として、次のような関数を使用できます。
function is_available($url, $timeout = 30) {
$ch = curl_init(); // get cURL handle
// set cURL options
$opts = array(CURLOPT_RETURNTRANSFER => true, // do not output to browser
CURLOPT_URL => $url, // set URL
CURLOPT_NOBODY => true, // do a HEAD request only
CURLOPT_TIMEOUT => $timeout); // set timeout
curl_setopt_array($ch, $opts);
curl_exec($ch); // do it!
$retval = curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200; // check if HTTP OK
curl_close($ch); // close handle
return $retval;
}
ただし、可能な最適化方法はたくさんあります。cURL インスタンスを再利用したり、ホストごとに複数の URL をチェックする場合は、接続を再利用したりすることもできます。
ああ、このコードは HTTP 応答コード 200 を厳密にチェックします。リダイレクト (302) には従いませんが、そのための cURL オプションもあります。