Надгледување статус на интернет страна со PHP

Надгледување на статус на интернет страна со PHP

Како веб програмери/администратори најверојатно сте се нашле во ситуација кога интернет страната на некој клиент е падната подолго време, а вие не сте приметиле. Во овој пост ќе ви понудам едно доста просто, но сепак ефикасно решение за ваквите проблеми. Имено ќе направиме скрипта во PHP што ќе проверува на секои 60 минути дали вашата интернет страна е достапна и функционира правилно.

Концептот е доста прост, ќе креираме една мала скрипта што ќе ја „контактира“ вашата интернет страна, односно повеќе интернет страни и потоа нивниот HTML markup тоа ќе го процесира. Во него ќе бараме одреден збор или реченица што е единствено карактеристичнo за интернет страната и само доколку тоa е целосно достапно ќе знаеме дека постои во HTML-от, и сето ова ќе го запишуваме со систем за евиденција.

Кодот од скриптата:

<?php

function zemi_markup( $url ) // фукнција која што ќе ги земе потребните информации
{
    $opcii = array(
        CURLOPT_RETURNTRANSFER => true,     // го враќа markup-от
        CURLOPT_HEADER         => false,    // не враќа заглавја
        CURLOPT_ENCODING       => "",       // подржува сите енкодинзи
        CURLOPT_USERAGENT      => "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.10) Gecko/20050716 Thunderbird/1.0.6", // user agent
        CURLOPT_FOLLOWLOCATION => true,     // следи пренасочувања
        CURLOPT_MAXREDIRS      => 10,       // застани после 10 пренасочувања
        CURLOPT_AUTOREFERER    => true,     // сетирај „препорачувачки линк“ после пренасочување
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout на конекција
        CURLOPT_TIMEOUT        => 120,      // timeout на одговор
    );

    $ch       = curl_init( $url );
    curl_setopt_array( $ch, $opcii );
    $sodrzina = curl_exec( $ch );
    $err      = curl_errno( $ch );
    $errmsg   = curl_error( $ch );
    $header   = curl_getinfo( $ch );
    curl_close( $ch );

    $header['errno']    = $err;
    $header['errmsg']   = $errmsg;
    $header['sodrzina'] = $sodrzina;
    return $header;
}

// низа со сите информации
$odgovor=zemi_markup( "http://www.list.mk/" );
$igla="Програмирање";
$seno=$odgovor['sodrzina'];
$baraj=strpos($seno, $igla);
if($odgovor['errno'] === 0) // доколку странта е достапна проверуваме дали е функционална
{
	if($baraj===false)// доколку е нефункционална подготвуваме запис за евиденција и праќаме мејл
	{
		$do="dar3.st@gmail.com";
		$naslov="Нефункционално";
		$sodrzina="[" . date('d.m.Y H:i:s') . "] Сајтот е достапен, но не е функционален! " ;
		if(mail($do, $naslov, $sodrzina))
		{
			$status="мејл е успешно пратен";

		}
		else
		{
   			$status="мејл не е успешно пратен";
 		}
		$LogInfo = "[" . date('d.m.Y H:i:s') . "] Сајтот е достапен, но не е функционален, " . $status . ".\n";
	}
	else
	{
		$LogInfo = "[" . date('d.m.Y H:i:s') . "] Сајтот е достапен.\n";
	}
	//евидентираме соодветно
	$datoteka = file_get_contents('Log.txt'); //  се зема претходната евиденција
	$LogDatoteka = "Log.txt"; //  име на датотеката за евиденција
	$ld = fopen($LogDatoteka, 'w') or die("неможе да се отвори датотека"); // се креира нова датотека
	fwrite($ld, $datoteka . $LogInfo); //  се запишува старата евиденција и новиот запис
	fclose($ld); //  сезатвора датотеката
}

else // доколку сајтот е паднат се праќа мејл и се запишува информација во лог
{
	$do="dar3.st@gmail.com";
	$naslov="Недостапно";
	$sodrzina="На проверката извршена на тој и тој датум, сајтот " . $url . "беше недостапен";
	if(mail($do, $naslov, $sodrzina))
	{
		$status="мејл е успешно пратен";

	}
	else
	{
   		$status="мејл не е успешно пратен";
 	}
	$datoteka = file_get_contents('Log.txt');
	$LogDatoteka = "Log.txt";
	$ld = fopen($LogDatoteka, 'w') or die("неможе да се отвори датотека");
	$LogInfo = "[" . date('d.m.Y H:i:s') . "] Сајтот не е достапен, " . $status . ".\n";
	fwrite($ld, $datoteka . $LogInfo);
	fclose($ld);
}
?>

Како што можете да видите скриптата проверува само една страна, но истата може и без поголеми потешкотии да проверува повеќе страници истовремено.

Јасно е дека вака скриптата не ни користи многу бидејќи некој ќе треба да ја проверува постојано и да надгледува статус. За да не сме врзани пред компјутер (целта е да не бидеме) ќе прилагодиме Cron Job што ќе ја извршува скриптата на секои 60 минути.

За таа цел отворете SSH конекција кон вашиот сервер и внесете го следново:

0 * * * * /usr/local/bin/php -q /htdocs/www/monitor.php

Напомена: Вашата скрипта треба да има привилегии за извршување (минимум 644), доколку нема прилагодете ги соодветно привилегиите.

Вака направената скрипта и поставен Cron Job ќе функционираат перфектно, но уште поинтересно би било доколку некој од вас успее да најде начин овие известувања да можат да пристигнуваат како СМС пораки. Јас се обидов да најдам начин, но не успеав. Ако некој од вас прилагодувањето на известување преку СМС пораки го свати како предизвик, добредојдени сте да го споделите со сите нас преку коментар.

gravatar
Автор: Стојковски Дарко
За авторот: Обожавам PHP али мразам CSS | се нервирам кога ќе испомешам колони и редови | слушам рок | немам Facebook имам Twitter | Моментално чекам да дојде 3 и 4 јули.

1 коментар

  1. На ваков текст убаво е да се напомене за кој систем се работи. Значи дали е ГНУ/Линукс или поточно на која дистрибуција е правено. Патеката до php не е иста на повеќето системи како што е наведено овде. Овој текст за некој што почнува со учење тешко ќе го разбере затоа што недостасуваат многу мали информации кои го олеснуваат тој процес на учење. Исто така, при променување на cron не се кажува во која датотека се сместува тој cron (дали во /etc/cron.hourly/monitorApache или пак во /etc/crontab), дали преку некој текст уредувач или преку crontab -e. Текстот е добар нова вакви работи фалат а се многу битни за почетниците.

    Што се однесува до известување преку СМС има лесен начин. Зимаш еден GPRS модул и само што ќе треба да е да се научат AT командите. Еве еден модул што мислам дека се наоѓа на нашиот пазар – Siemens MC39i. Иако ова ми стои на располагање никогаш не сум имал потреба да го тестирам.