Используйте расширение PHP cURL. В отличие от fopen () он также может отправлять HTTP-запросы HEAD, которые достаточны для проверки доступности URL-адреса и позволяют сэкономить массу трафика, поскольку вам не нужно загружать весь текст страницы для проверки.
В качестве отправной точки вы можете использовать такую функцию, как эта:
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.