Скрипт PHP: проверка доступности сайта fopen и cURL

Проверка доступности сайта с помощью fopen()

Скрипт, приведенный ниже, пытается прочитать страницу (картинку, css-файл и др.), по заданному url. Если ответ от сервера с содержимым не поступит в течении 10 секунд, сайт или то, что запрошено, будет считаться не доступным.

$url = 'http://obovsem.org.ua/';
ini_set('default_socket_timeout', '10');
$fp = fopen($url, "r");
$res = fread($fp, 500);
fclose($fp);
if (strlen($res) > 0)
  echo 'Сайт '.$url.' доступен';
else
  echo 'Сайт '.$url.' не доступен';

По умолчанию в PHP ожидание ответа посланного с помощью сокетов (fopen) длится 60 сек.

Проверка ответа сервера при помощи cURL (Libcurl)

cURL - подключаемая библиотека (в PHP она называется Libcurl) для работы по различным протаколам, в том числе и HTTP. С ее помощью можно узнать ответ сервера, что позволяет определить, доступен ли запрашиваемый сайт в данный момент. Эта библиотека доступна практически на всех хостинг-площадках. Документацию по функциям и возможностям библиотеки cURL в PHP можно посмотреть тут: www.php.net/manual/ru/book.curl.php, php.net/curl.

function check_domain_availible($domain)
  {
  if (!filter_var($domain, FILTER_VALIDATE_URL))
    return false;

  $curlInit = curl_init($domain);
  curl_setopt($curlInit, CURLOPT_CONNECTTIMEOUT, 10);
  curl_setopt($curlInit, CURLOPT_HEADER, true);
  curl_setopt($curlInit, CURLOPT_NOBODY, true);
  curl_setopt($curlInit, CURLOPT_RETURNTRANSFER, true);

  $response = curl_exec($curlInit);
  curl_close($curlInit);

  if ($response)
    return true;
  return false;
  }

$url = 'http://obovsem.org.ua/';
if (check_domain_availible($url))
  echo 'Сайт '.$url.' доступен';
else
  echo 'Сайт '.$url.' не доступен';

Функция check_domain_availible() пытается получить ответ от сервера, и если он есть, сайт считается доступным. Обратите внимание, что ответ от сервера может быть с каким угодно статусом HTTP: HTTP 301 (редирект на другую страницу), HTTP 404 (страница не найдена) и т.д. Детальную инфформацию о статусах HTTP можно посмотреть тут: "Status code definitions (w3.org eng)", "Ответы Google для Web-мастеров" и "коды статуса http (поиск в Google)".

Функция filter_var() появилась в PHP 5 и служит заменой некоторых регулярных выражений, часто используемых в скриптах: проверка на соответствие введенных данных URL, E-mail и др. Документация по этой функции тут: описание функции filter_var(), фильтры функции filter_var().

Чтобы узнать только HTTP статус ответа сервера, и уже на его основании делать выводы о доступности или не доступности сайта, можно использовать скрипт, приведенный ниже:

function check_http_status($url)
  {
  $user_agent = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)';
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_VERBOSE, false);
  curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_SSLVERSION, 3);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  $page = curl_exec($ch);

  $err = curl_error($ch);
  if (!empty($err))
    return $err;
 
  $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  curl_close($ch);
  return $httpcode;
  }

$url = 'http://obovsem.org.ua/';
$answer = check_http_status($url);
echo 'Код статуса HTTP: '.$answer.'. Ответ на запрос URL: '.$url;
Опубликовано: 2011/05/28
HTML-код ссылки на эту страницу:
<a href="http://petrenco.com/php.php?txt=20" target="_blank">Проверка доступности сайта средствами PHP: fopen и cURL</a>
36626
Комментарии
Спасибо, пригодилось!
мне тоже пригодилось , сенкс
Так, нашел неприятный баг в пхп 4-5.. если такого адреса ВООБЩЕ не существует, выводит ошибок на 7-8 строк.. проще так

else
echo 'Сайт '.$url.' не доступен';
Код не влез, короче, @ini_set('default_socket_timeout', '10');$fp = @fopen($url, "r");$res = @fread($fp, 500);@fclose($fp);
Добавить комментарий
Ваш e-mail: (не виден посетителям сайта)
Ваше имя:
Комментарий:
Символы с картинки:
Только выделенные поля формы добавления комментариев обязательны к заполнению.