PHP – proste sprawdzanie dostępności witryny

Dzisiaj dosyć szybki wpis, może po prostu komuś przyda się niewielki skrypt w PHP jaki napisałem jakiś czas temu na własne potrzeby. Jego zadaniem jest po prostu sprawdzanie dostępności witryny. Nie robi nic specjalnego, bo po prostu sprawdza kod odpowiedzi na żądanie do serwera przy użyciu cURLa. Jeżeli nie jest równy 200, czyli oznaczający że wszystko gra, to wysyła na podany adres wiadomość email o padzie. Gdy serwis wróci do życia, wyśle drugi email z informacją, jak długo trwał czas niedostępności. Jak można się domyślić, skrypt korzysta z crona i najlepiej właśnie z niego go odpalać. Dlaczego w ogóle w PHP? A dlaczego nie?

Wymagania

Wymagania nie są zbyt wielkie, powinien je spełniać każdy szanujący się hosting, nawet tani:

  • obsługa cURL w PHP
  • działający mail()
  • otwarty port 80/443
  • cron

Skrypt

// Timezone
@date_default_timezone_set('Europe/Warsaw');

// Config
$url = 'http://mydomain.com/'; 
$email_to = '[email protected]';
$email_from = '[email protected]';
$error = false;
$time_now = date('d.m.Y H:i', time());
$file = 'uptime_info';

// Check code
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if($status !== 200)
{
    $error = true;
}

// If downed and now ok - send email
if (file_exists($file) && !$error)
{
    $time = filemtime($file);
    $downtime = round(abs(time() - $time) / 60,2). " minutes";

    @unlink($file);
    $subject = 'Website Monitor - up';
    $error_info = "Website is up.\nDowntime: {$downtime}";
    $error_info .= "\nCheck time: {$time_now}";
    plmail($email_to, $subject, $error_info);
}
else if (!file_exists($file) && $error)
{
    file_put_contents($file, '1');
    $subject = 'Website Monitor - down';
    $error_info = "Website is down.";
    $error_info .= "\nCheck time: {$time_now}";
    plmail($email_to, $subject, $error_info);
}

// Send email with polish chars
function plmail($mail, $sub, $mes)
{
    global $email_from;

    $headers = "From: Monitor <" . $email_from . ">\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/plain; charset=utf-8\r\n";
    $headers .="Content-Transfer-Encoding: 8bit";

    $mes=htmlspecialchars_decode($mes,ENT_QUOTES);//optional - I use encoding to POST data
    mail($mail, "=?utf-8?B?".base64_encode($sub)."?=", $mes, $headers);
}

To tyle. Wystarczy zaaplikować na serwer, dodać odpowiedni dopisek do crona i mamy sprawdzanie witryny. Oczywiście trudno to porównywać z serwisami wyspecjalizowanymi w takim sprawdzaniu – tylko od nas zależy z ilu lokalizacji to sprawdzimy, ale jeżeli mamy więcej niż jedno konto hostingowe/shellowe, to po prostu możemy to zrobić za darmo i to z czasem sprawdzania na poziomie np. co minutę, a nie jak w darmowych usługach co 15 minut.

Licencja?
Jeżeli już ktoś koniecznie chce dla takiego maleństwa mieć info, to przyjmijmy LGPLv3.

2 thoughts on “PHP – proste sprawdzanie dostępności witryny

  1. wtyczka odpowiadająca za kolorowanie kodu, który wstawiasz na bloga, psuje go. mowa o && w ifach

    1. Faktycznie, dzięki za info. Wywalę to jednak, bo kodu we wpisach nie ma tyle dużo, aby był sens za każdym razem to ładować. Poza tym, czysty pre + css wyglądają ładniej :)

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.