Программирование

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

С задачей проверки доступности сайта я столкнулся довольно давно, когда все соответствующие инструменты были либо платными, либо не внушали доверия. Это сейчас есть множество сервисов, которые мониторят ваши сайты чуть ли не ежеминутно и посылают уведомления в случае проблем, та же Яндекс.Метрика, например. Но мы, как всегда, пойдем своим путем и по новой изобретем велосипед.

Все что нам нужно узнать — это заголовок сервера, точнее http код. Если он равен 200, то все в порядке, в остальных случаях сайт, скорее всего, уже не работает.

Выбирая из нескольких способов реализации, я прежде всего отталкивался от скорости работы тех или иных функций и остановился на библиотеке curl, так как она позволяет организовать мультипоточность. Поехали.

Первым делом создадим 2 переменные: в $text поместим список сайтов через запятую, а в $pochta наш email, на который будем отсылать сообщения в случае проблем.

$text = "google.ru, www.yandex.ru, rambler.ru, mail.ru";
$pochta = "[email protected]";

Превращаем строку в массив с помощью explode,

$sites = explode(",", $text);

а дальше делаем практически все по учебнику:

//создаем набор дескрипторов
$mult = curl_multi_init();
$handles = array();

for ($i = 0; $i < count($sites); $i++) {
    $sites[$i] = trim($sites[$i]);
    $handles[$i] = curl_init();

    //устанавливаем URL и другие соответствующие опции
    curl_setopt($handles[$i], CURLOPT_URL, $sites[$i]);
    curl_setopt($handles[$i], CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($handles[$i], CURLOPT_FOLLOWLOCATION, true);  
    curl_setopt($handles[$i], CURLOPT_MAXREDIRS, 5);  
    curl_setopt($handles[$i], CURLOPT_TIMEOUT, 10);

    //добавляем дескрипторы
    curl_multi_add_handle($mult, $handles[$i]);
}

Осталось только запустить дескрипторы

$active = null;

do {
    $mrc = curl_multi_exec($mult, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mult) != -1) {
        do {
            $mrc = curl_multi_exec($mult, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

и обработать результат.

for ($i = 0; $i < count($sites); $i++) {
    $err = curl_error($handles[$i]);
    if (!empty($err))
        $code = $err;
    else
        $code = curl_getinfo($handles[$i], CURLINFO_HTTP_CODE);
    if (is_int($code) && $code != 200)
        mail($pochta, 'Проблема с доступностью сайта '.$sites[$i], 'При открытии Вашего сайта '.$sites[$i].' возникла ошибка "'.$code.'" - '.date("H:i:s d.m.Y"), 'From:[email protected]');
    else if (!is_int($code))
        mail($pochta, 'Проблема с доступностью сайта '.$sites[$i], 'При открытии Вашего сайта '.$sites[$i].' произошла ошибка "'.$code.'" - '.date("H:i:s d.m.Y"), 'From:[email protected]');
}

Здесь мы проверяем на ошибки, записываем в переменную наш http код и отправляем письмо функцией mail (сейчас я везде использую PHPMailer, но мне лень переписывать эту старую статью).

Закрываем все дескрипторы и наслаждаемся жизнью.

for ($i = 0; $i < count($handles); $i++) {
   curl_multi_remove_handle($mult, $handles[$i]);
}
curl_multi_close($mult);

Как видите, ничего сложного нет. Теперь можно этот скрипт запускать по крону, но я бы все же воспользовался услугами какого-либо сервиса, ведь в некоторых из них есть возможность получения смс, что намного удобнее.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *