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

Форум для тех кто начинает осваивать язык php.
Аватара пользователя
FominD
Сообщения: 6

Уведомление на 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
Сообщения: 76

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

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

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

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

<?php 
    
# Функция для проверки статуса сайта
    
function getHttpCode$url ){        
        
# Создаём сеанс работы с CURL
        
$ch curl_init$url );
        
        
# Устанавливаем настройки
        
curl_setopt$chCURLOPT_NOBODYtrue ); 
        
        
# Выполняем запрос
        
curl_exec$ch );
        
        
# Получаем код и возвращаем
        
return 
            
curl_getinfo$chCURLINFO_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

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

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

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

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

<?php
    
# Функция для проверки статуса сайта
    
function getHttpCode$url ){        
        
# Создаём сеанс работы с CURL
        
$ch curl_init$url );
        
        
# Устанавливаем настройки
        
curl_setopt$chCURLOPT_NOBODYtrue ); 
        
        
# Выполняем запрос
        
curl_exec$ch );
        
        
# Получаем код и возвращаем
        
return 
        
curl_getinfo$chCURLINFO_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
Сообщения: 333
Поблагодарили: 3 раза

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

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

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

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
Сообщения: 333
Поблагодарили: 3 раза

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

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

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

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

<?php 
    
# Функция для проверки статуса сайта
    
function getHttpCode$url ){        
        
# Создаём сеанс работы с CURL
        
$ch curl_init$url );
        
        
# Устанавливаем настройки
        
curl_setopt$chCURLOPT_NOBODYtrue ); 
        
        
# Выполняем запрос
        
curl_exec$ch );
        
        
# Получаем код и возвращаем
        
return 
        
curl_getinfo$chCURLINFO_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
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

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

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

1. На Ваше усмотрение, код можно постоянно обновлять, чем то новым и что то добавлять. А можно оставить все как есть.
2. Сделать проверку (выполнение скрипта) по расписанию, например при помощи CRON'а. Если надо не больше трех раз в сутки, значит делаем проверку каждые восемь часов.
cefp
Сообщения: 333
Поблагодарили: 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
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

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)) 
{
    
# Тут формируем уведомление

Ну, как то так...
Возможно есть вариант попроще, но это первое, что пришло в голову.

Вернуться в «PHP»

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

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