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.