DB接続エラーの時にメール通知する【WordPress】

  • 投稿 : 2015-12-03
wp-db-error01.png

/wp-content直下に「db-error.php」というファイル名で以下のPHPコードを置くとDB接続エラー時にメールを送信します。サーバーは生きているが、MYSQLだけが障害が起こっているときなどに上記のエラーになります。

<?php
header( 'HTTP/1.1 503 Service Unavailable' );
header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' );
header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' );
header( 'Cache-Control: no-cache, must-revalidate, max-age=0' );
header( 'Pragma: no-cache' );
header( 'Content-Type: text/html; charset=utf-8' );

//-----------
//ユーザー定義関数
//-----------
function is_lock_ex($fileName,$min){
   $ret =false;
   //ファイルが存在して
   //更新日付が$min分以内なら true
   if(file_exists($fileName) ){
      $del_time = time()-60*$min; //$min分前
      $f_mtime = filemtime($fileName); //ファイルの更新日
      if($f_mtime>$del_time) {
         $ret = true;
      }
   }
   return $ret;
}
function write_lock_file($fileName){
   touch($fileName);
}
//-----------
//HTML表示
//-----------
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>データベースエラー</title>
</head>
<body id="error-page">
<h1>503 Service Unavailable - DB Error</h1>
<p>ただいまサーバのデータベースに接続できないようです。<br />
数分後に再度リロードしてみてください。</p>
<p>ご不便おかけしますが、よろしくお願いいたします。</p>
</body>
</html>
<?php

$lock_file = dirname(__FILE__)."/db-error-lock.txt";

//-----------
//メールを1度送信したら5分間は再送信しない
//-----------
if(is_lock_ex($lock_file,5)){return;}
write_lock_file($lock_file);

//-----------
//メール送信
//-----------
//宛先
$to = "test@example.com";
//差出人
$header = "From: "."test@example.com";
//件名
$subject = $_SERVER['SERVER_NAME']." WP DB ERROR";
//本文
$body = $_SERVER['SERVER_NAME']." WP DB ERROR";;

if(mb_send_mail($to,$subject,$body,$header)){
   //echo "メール送信成功しました。";
}else{
   //echo "メール送信失敗しました。";
}

?>

・Wordpressの機能で、DB接続エラー時に「db-error.php」というファイルがあるとそれを表示します
・db-error.phpの中で、メールを送信するロジックを書きます
・is_lock_ex($lock_file,5)の5の部分が、5分で、5分間このページが表示されても1度しかメールを送信しませんというロジックです。
・$to = "test@example.com"; に送信されるので、この部分を書き換えて使ってください

メールの送信先などは、上記の後半の部分の変数を書き換えることで対応してください。
DB接続エラーなので、Wordpressの機能をなるべく使わないでロジックを書く必要があります。

■動作確認方法
wp-config.phpの「define('DB_NAME', 'xxxxx');」あたりを存在しないDB名に書き換えるだけで、DB接続エラーになるので動作確認できるかと思います。
スポンサーリンク