Когда сайтов в обслуживании становится довольно много, появляется необходимость системного подхода к мониторингу работоспособности. Хотя бы на примитивном уровне — доступен ли сайт.
Идея следующая — сделать специальный шаблон в котором, при загрузке страницы, генерируются скриншоты сайтов.
Создание шаблона мониторинга
Создаем типа записи — сайт (это необязательно, но добавит автоматизации процессу добавления новых сайтов, чтобы не прописывать вручную). Если делать на отдельном сайте, то это не потребуется, можно использовать стандартные записи. Далее создаем шаблон в котором и будет происходить мониторинг, привязываем его к конкретной странице. Использую Api сервиса по созданию скриншотов www.s-shot.ru размечаем вывод динамических скриншотов во фрейме.
<iframe src="https://mini.s-shot.ru/?https://site.ru" width="400" height="300"></iframe>
Как вариант, можно в iframe грузить весь сайт, причем скорость загрузки страницы довольно высока. Но тут есть другая проблема: если наш сайт работает по протоколу https, то он не даст загрузить через iframe сайты с протоколом http.
Как получить изображение страницы целиком
При создании скриншотов, возник параллельный вопрос, связанный с другими целями — как получить полное изображение страницы во всю длину (не только скриншот). Недолгим поиском удалось найти несколько решений:
1. В FireFox есть встроенная функция. Вызываем командную строку Shift + F2 и пишем команду
screenshot file.png --fullpage
и нажимаем Enter. Изначально скрытые элементы на странице, необходимо загрузить прокруткой.
Если нужен скриншот а не вся страница: screenshot file.png
2. Расширение Chrome — Full Page Screen Capture. Пока не использовал.
В Chrome также можно сделать скриншот через инструменты разработчика. Вызываем DevTools (ctrl+shift+i ), вызываем консоль (ctrl+shift+p), пишем Capture full size screenshot нажимаем Enter. Скриншот автоматически загрузится.
Коды ответов протокола HTTP
1XX — Информационные.
2XX — Успех. 200 — страница существует и загружена.
3XX — Перенаправления.
4XX — Ошибки клиента.
5XX — Ошибки сервера. 500 — запущен сценарий, при выполнении которого произошла ошибка.
Действенные методы мониторинга
С кодом ответа сервера
Создаём шаблон на каком-либо своём сайте, с перечнем сайтов которые нужно мониторить.
$urls = Array(
'Сайт 1' => 'https://site1.ru/',
'Сайт 2' => 'https://site2.com/',
'Сайт 3' => 'https://site3.ru/',
);
И ниже прописываем функцию получения ответов циклом:
echo '<table>';
foreach($urls as $site => $url) {
// Получение данных
$handle = curl_init($url);
curl_setopt($handle, CURLOPT_NOBODY, 1);
$response = curl_exec($handle);
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE)."\n\r";
if($httpCode != 200) {
echo '<tr>';
echo '<td>'.$site.' (<a href="'.$url.'" target="_blank">'.$url.'</a>)</td><td class="red">'.$httpCode.'</td>';
echo '</tr>';
// Отправляем письмо админу о том что сайт не работает
$mail_to = 'mail@mail.ru';
$theme = "Сайт $site не работает";
$msg = "<p>Доброго времени суток!</p><br/>";
$msg .= "<p>Уважаемый администратор, <br/>по каким-то причинам сайт $site ($url) не работает.</p>";
$msg .= "<p>Код ответа сервера: <strong>$httpCode</strong>.</p>";
$headers = "Content-Type: text/html; charset=utf-8\n";
$headers .= 'From: '.get_bloginfo().' <no-replay@'.$_SERVER['HTTP_HOST'].'>' . "\r\n";
wp_mail($mail_to, $theme, $msg, $headers);
} else {
echo '<tr>';
echo '<td>'.$site.' (<a href="'.$url.'" target="_blank">'.$url.'</a>)</td><td class="green">'.$httpCode.'</td>';
echo '</tr>';
}
curl_close($handle);
}
echo '</table>';
Шаблон привязываем к странице и вешаем на полученный url CRON-задачу. Например проверять каждый час:
wget -O /dev/null -t 1 -q ‘https://site.ru/test-sites/’
Более быстрый способ проверки, без кода ответа (требует доработки)
Делаем все тоже самое, только в перечне сайтов указывает только домены:
$urls = Array(
'Сайт 1' => 'site1.ru',
'Сайт 2' => 'site2.com',
'Сайт 3' => 'site3.ru',
);
И функция проверки будет следующая:
echo '<table>';
foreach($urls as $site => $url) {
if($socket =@ fsockopen($url, 80, $errno, $errstr, 30)) {
echo '<tr>';
echo '<td>'.$site.' (<a href="https://'.$url.'" target="_blank">'.$url.'</a>)</td><td class="green">Доступен</td>';
echo '</tr>';
fclose($socket);
} else {
echo '<tr>';
echo '<td>'.$site.' (<a href="https://'.$url.'" target="_blank">'.$url.'</a>)</td><td class="red">Не доступен</td>';
echo '</tr>';
// Отправляем письмо админу о том что сайт не работает
$mail_to = 'mail@mail.ru';
$theme = "Сайт $site не работает";
$msg = "<p>Доброго времени суток!</p>";
$msg .= "<p>Уважаемый администратор, <br/>по каким-то причинам сайт $site ($url) не работает.</p>";
$headers = "Content-Type: text/html; charset=utf-8\n";
$headers .= 'From: '.get_bloginfo().' <no-replay@'.$_SERVER['HTTP_HOST'].'>' . "\r\n";
wp_mail($mail_to, $theme, $msg, $headers);
}
}
echo '</table>';
Будет отправлено письмо на указанный e-mail в случае кода ответа сервера отличного от 200 (в первом методе) или недоступности сайта (во втором методе).