下記のプログラムをcronで定期的に実行する。

HTTPヘッダーを取得する方法

// 負荷に応じて、分岐処理を少なくする

$mail = 'info@example.com';
$targetServer = 'https://isaxxx.com/';
// 先頭の@マークは、スクリプトエラーが生じた場合に、エラーメッセージを表示させないための記号
$headers = @get_headers($targetServer, 1);
if (!$headers) {
  mail($mail, 'HTTPヘッダーが取得できませんでした', $targetServer, 'From:'.$mail);
} else if ($headers[0] !== 'HTTP/1.1 200 OK' && $headers [0] !== 'HTTP/1.0 200 OK') {
  mail($mail, 'HTTPヘッダーに異常があります' . $headers[0], $targetServer, 'From:'.$mail);
} else {
  $t1 = microtime(true);
  $html = @file_get_contents($targetServer);
  $t2 = microtime(true);
  if ($html === '') { // 他にもデータベースの接続に失敗している場合の文字列など
    mail($mail, 'Webサイトに異常があります', $targetServer, 'From:'.$mail);
  } else {
    $responseTime = floor(($t2 - $t1) * 1000;
    preg_match ("/<title>(.*)<\/title>/i", $html, $match);
    echo $match[1] . ': ' . $responseTime;
  }
}

ping 送信する方法

$mail = 'info@example.com';
$targetServer = 'https://isaxxx.com/';
$targetServerIP = 'xxx.xxx.xxx.xxx';

$ping_command_str = 'ping -c 3 -w 5 ' . $targetServerIP;
if (strstr(`$ping_command_str`, '100% packet loss')) {
  mail($mail, 'Webサイトに異常があります', $targetServer, 'From:'.$mail);
}

データベースの死活監視

// 監視するサーバーに設置し、外部サーバーで状態を確認する
define('MYSQL_HOST', 'localhost');
define('MYSQL_USER', 'xxx');
define('MYSQL_PASS', 'xxx');

$link = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die('error');
if ($link) {
  mysql_close($link);
  echo '1';
}