Уведомление на e-mail в случае недоступности сайта

Форум для тех кто начинает осваивать язык php.
Аватара пользователя
FominD
Сообщения: 6
Зарегистрирован: Вс апр 19, 2015 1:45 pm

Уведомление на e-mail в случае недоступности сайта

Сообщение FominD » Пн апр 27, 2015 10:53 am

Мастерю скрипт проверки доступности сайта. Смысл такой – делается запрос страницы, если ответ 404 или 50*, то отсылается сообщение на e-mail. Скрипт запускается кроном каждые энцать минут. Сам скрипт работает на другом хостинге.
С отправлением сообщения разобрался, а вот с выполнением запроса и проверкой кода не могу.
Пока что вот такой скрипт:

Код: Выделить всё

<?php
$check_url = get_headers('http://yandex.ru/'); 
if ($check_url = '')
{
    $status = ""; /* Код ответа сервера */
    $myemail = "myemail@ya.ru";
    $message_to_myemail = "Привет! Привет! С сайтом какие-то проблемы! Ответ сервера:$status.";
    $from  = "From: Проверялка <no-reply> \r\n Reply-To: no-reply \r\n";
    mail($myemail, $message_to_myemail, $from);
}
?>
В php только-только осваиваюсь. Помогите доделать, пожалуйста.

Реклама
lyod
Сообщения: 75
Зарегистрирован: Пн янв 06, 2014 11:13 pm
Поблагодарили: 1 раз

Re: Уведомление на e-mail в случае недоступности сайта

Сообщение lyod » Пн апр 27, 2015 11:56 am

Наверное лучше с помощью CURL это делать. А-то нужно ещё разбирать заголовок ответа. А в CURL можно чистый код ответа получить.

Код: Выделить всё

<?php 
    # Функция для проверки статуса сайта
    function getHttpCode( $url ){        
        # Создаём сеанс работы с CURL
        $ch = curl_init( $url );
        
        # Устанавливаем настройки
        curl_setopt( $ch, CURLOPT_NOBODY, true ); 
        
        # Выполняем запрос
        curl_exec( $ch );
        
        # Получаем код и возвращаем
        return 
            curl_getinfo( $ch, CURLINFO_HTTP_CODE );
    }

    # Если сайт возвращает HTTP-код более 400
    if ( $status = getHttpCode('http://example.com/') > 400 )
    {
        $myemail = "myemail@ya.ru";
        $message_to_myemail = "Привет! Привет! С сайтом какие-то проблемы! Ответ сервера:$status.";
        $from  = "From: Проверялка <no-reply> \r\n Reply-To: no-reply \r\n";
        mail($myemail, $message_to_myemail, $from);
    } 

Аватара пользователя
FominD
Сообщения: 6
Зарегистрирован: Вс апр 19, 2015 1:45 pm

Re: Уведомление на e-mail в случае недоступности сайта

Сообщение FominD » Сб май 16, 2015 12:15 pm

Спасибо, функция замечательная. Получилась вот такая проверялка:

Код: Выделить всё

<?php
    # Функция для проверки статуса сайта
    function getHttpCode( $url ){        
        # Создаём сеанс работы с CURL
        $ch = curl_init( $url );
        
        # Устанавливаем настройки
        curl_setopt( $ch, CURLOPT_NOBODY, true ); 
        
        # Выполняем запрос
        curl_exec( $ch );
        
        # Получаем код и возвращаем
        return 
        curl_getinfo( $ch, CURLINFO_HTTP_CODE );
    }
    
$status = getHttpCode('http://site.ru/');

if ( $status > 400 )
    {
        $myemail = "email@ya.ru";
        $message_to_myemail = "Привет! С сайтом какие-то проблемы! Ответ сервера: $status.";
        $from  = "Ответ сервера: $status.";
        mail($myemail, $message_to_myemail, $from);
    }

 echo "<br /><br /><center>Ответ сервера: $status.</center>"; 
 
 ?>

cefp
Сообщения: 334
Зарегистрирован: Ср окт 17, 2012 6:49 pm
Поблагодарили: 3 раза

Re: Уведомление на e-mail в случае недоступности сайта

Сообщение cefp » Ср июн 10, 2015 10:47 pm

Интересно как доработать проверялку, чтобы она еще проверяла время загрузки страницы, и если страница загружается на 5 секунд дольше обычного, то отсылала письмо.
d o h o d - s - n u l y a .ru - идеи бизнеса.

Аватара пользователя
Slash
Администратор
Сообщения: 2125
Зарегистрирован: Сб авг 11, 2012 7:39 am
Поблагодарили: 75 раз

Re: Уведомление на e-mail в случае недоступности сайта

Сообщение Slash » Чт июн 11, 2015 7:17 am

cefp, как то попалось мне на глаза вот такое решение:

Код: Выделить всё

$url = 'http://danfa.org'; # Вбиваем адрес страницы, которую надо проверить 
$start = gettimeofday();
file_get_contents($url);
$end = gettimeofday();
$result = (float)($end['sec'] - $start['sec']) + ((float)($end['usec'] - $start['usec']) / 1000000);

echo 'Страница <strong>' . $url . '</strong> сгенерирована за <strong>' . $result . '</strong> секунд.'; 
Тут остается лишь добавить проверку, что то типа того:

Код: Выделить всё

if ($result >= 5.000000) # Сравниваем время загрузки страницы, если время больше допустимого, то отправляем письмо
{
    # Тут код формирования и отправки письма
} 

cefp
Сообщения: 334
Зарегистрирован: Ср окт 17, 2012 6:49 pm
Поблагодарили: 3 раза

Еще два вопроса по автоматическому уведомлению

Сообщение cefp » Пт июн 12, 2015 12:52 am

Slash, благодарю за ответ.
Вот такой код получился:

Код: Выделить всё

<?php 
    # Функция для проверки статуса сайта
    function getHttpCode( $url ){        
        # Создаём сеанс работы с CURL
        $ch = curl_init( $url );
        
        # Устанавливаем настройки
        curl_setopt( $ch, CURLOPT_NOBODY, true ); 
        
        # Выполняем запрос
        curl_exec( $ch );
        
        # Получаем код и возвращаем
        return 
        curl_getinfo( $ch, CURLINFO_HTTP_CODE );
    }
    
$status = getHttpCode('http://site.ru/');

if ( $status > 400 )
    {
        $myemail = "email@ya.ru";
        $message_to_myemail = "Привет! С сайтом какие-то проблемы! Ответ сервера: $status.";
        $from  = "Ответ сервера: $status.";
        mail($myemail, $message_to_myemail, $from);
    }

echo "<br /><br /><center>Ответ сервера: $status.</center>"; 
 
$url = 'http://danfa.org'; # Вбиваем адрес страницы, которую надо проверить
$start = gettimeofday();
file_get_contents($url);
$end = gettimeofday();
$result = (float)($end['sec'] - $start['sec']) + ((float)($end['usec'] - $start['usec']) / 1000000);

echo 'Страница <strong>' . $url . '</strong> сгенерирована за <strong>' . $result . '</strong> секунд.';
 
if ($result >= 5.000000) # Сравниваем время загрузки страницы, если время больше допустимого, то отправляем письмо
{
    $myemail = "email@ya.ru";
        $message_to_myemail = "Привет! С сайтом какие-то проблемы! Сайт загружается:  $result секунд(ы).";
        $from  = "Время загрузки сайта: $result с.";
        mail($myemail, $message_to_myemail, $from);
}
?>
Еще два вопроса появилось.
1. Этот код я сохраню в файл uvedomleni.php и загружу на хостинг. Нужно ли мне еще какой-то код добавлять в файл?
2. Как сделать, так чтобы письма отсылались не чаще чем один раз за полчаса и не больше трех писем в сутки?
d o h o d - s - n u l y a .ru - идеи бизнеса.

Аватара пользователя
Slash
Администратор
Сообщения: 2125
Зарегистрирован: Сб авг 11, 2012 7:39 am
Поблагодарили: 75 раз

Re: Уведомление на e-mail в случае недоступности сайта

Сообщение Slash » Пт июн 12, 2015 7:22 am

1. На Ваше усмотрение, код можно постоянно обновлять, чем то новым и что то добавлять. А можно оставить все как есть.
2. Сделать проверку (выполнение скрипта) по расписанию, например при помощи CRON'а. Если надо не больше трех раз в сутки, значит делаем проверку каждые восемь часов.

cefp
Сообщения: 334
Зарегистрирован: Ср окт 17, 2012 6:49 pm
Поблагодарили: 3 раза

Re: Уведомление на e-mail в случае недоступности сайта

Сообщение cefp » Пт июн 12, 2015 9:21 am

Хотелось бы сделать так, чтобы скрипт проверял сайт каждые 5 минут, но письма отсылал не чаще чем один раз в полчаса. Вообще в дальнейшем есть задумка дополнить скрипт функцией сохранения логов. Ограничение на отсылку нужно для того чтобы в почтовом ящике не скапливалось много писем. Если скрипт увидел, что сайт не работает, то нет смысла слать одинаковые письма каждые 5 минут. Можно высылать раз в полчаса лог за это время.
d o h o d - s - n u l y a .ru - идеи бизнеса.

Аватара пользователя
Slash
Администратор
Сообщения: 2125
Зарегистрирован: Сб авг 11, 2012 7:39 am
Поблагодарили: 75 раз

Re: Уведомление на e-mail в случае недоступности сайта

Сообщение Slash » Пт июн 12, 2015 10:18 pm

Отдаем Cron'у команду на выполнение скрипта uvedomleni.php каждые пять минут:

Код: Выделить всё

*/5 * * * * php -f /home/www/mysite/public_html/uvedomleni.php
Загнать в массив время, в которое надо отправлять уведомление:

Код: Выделить всё

$arrtime = array 
(
    '18:30',
    '19:00',
    '19:30'
    # И так далее...
); 
Затем сравнивать текущие время в массиве и если такое время есть, то отправлять уведомление:

Код: Выделить всё

$time = date('G:i'); # Получаем текущие время
if (in_array($time, $arrtime)) 
{
    # Тут формируем уведомление
} 
Ну, как то так...
Возможно есть вариант попроще, но это первое, что пришло в голову.

Ответить Пред. темаСлед. тема

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя