Скрипт проверки доступности сайта
posted in Полезности, Программирование |
Давненько уже собирался написать маленький, но ИМХО очень полезный скриптик — контроль работоспособности сайтов.
Вроде существует достаточно сервисов-аналогов — я с лёту парочку попробовал — не совсем то, да и вообще «своя рубаха ближе к телу».
Недавний выход из строя дата центра, и ессно моего сервака — стало последней каплей к написанию сего скрипта.
Идея простая — дёргаем морду сайта — смотрим заголовок ответа — если сменился, кидаем админу (в данном случае мне) смс-ку о смене статуса. Всё это дело загоняем в крон и усё.
Собственно — вот код (всё с комментариями):
В папке где лежит сам скрипт, создаем папочку caсhe, куда кидаем domains.txt со списком чекаемых доменов (страничек) (без http://).
Так же рекомендую бросить в папку файлик .htaccess с содержимым deny from all
Остальные файлы (логи опросов и текущее состояние) должны создаться сами при первом запуске скрипта (прав должно хватить т.к. крон запускается от имени пользователя имеющего доступ к файлам на создание и модификацию).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<?php set_time_limit(0); ignore_user_abort(); ini_set('display_errors',1); ini_set("error_reporting", E_ALL); $PID = getmypid(); $cachedir = "caсhe"; // папочка в которой лежат файлы с данными, сюда же будет складываться лог опроса страничек $mailto = "79131111234@sms.mtslife.ru"; // мыло куда будет кидаться письмо, в данном случае смс $subject = "allert"; // тема письма $message = ""; $arr = file("./$cachedir/domains.txt"); // файл с доменами которые нужно контролировать $buf = file_get_contents("./$cachedir/states.txt"); // сюда кидаем текущее состояние сайтов if (strlen($buf)>5) { $states = unserialize($buf); } foreach ($arr as $ar) { $domain = trim($ar," \r\n\t"); if (empty($domain)) continue; if (!isset($states[$domain])) $states[$domain]=0; $url = "http://".$domain."/"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $buf = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); tolog("log", $url."\t".$http_code); if ($states[$domain]!=$http_code) { tolog("fail", $url."\t".$states[$domain]."=>".$http_code); $message.= $url."\n".$states[$domain]."=>".$http_code."\n"; $states[$domain] = $http_code; } } file_put_contents("./$cachedir/states.txt", serialize($states)); if (!empty($message)) mail($mailto, $subject, $message); function tolog($filename, $str) { global $PID, $cachedir; $fp = fopen("./$cachedir/".$filename.".log","a+"); fwrite($fp,$PID."\t".date("d.m.Y")." ".strftime("\t%H:%M:%S"."\t")); fwrite($fp,"$str\n"); fclose($fp); } ?> |