PHPで「Notice」や「Warning」が発生した際に"光"でお知らせする方法
PHPに限らない話だが、デバッグ中やテスト中などにエラーメッセージが出た場合は漏らさずチェックしたいものである。
しかし、php.iniで「display_errors = On」と設定し、注意深く画面を見ていたとしても気づかないことは多々ある。
・ヘッダーの裏に文字が出ていたので見えなかった。
エラーメッセージの分だけ全体的にコンテンツ部分が下にずれていたりするが、急いで操作していると気づかない。
・jQueryDialogなどのダイアログを閉じる瞬間に警告メッセージが表示され、見逃してしまう。
submit結果のHTMLをdialog内に流し込んでいたりすると、ダイアログを閉じるJavascriptと共に警告メッセージがダイアログ内に流し込まれ、
次の瞬間にはダイアログが閉じてしまう。
などなど。
そのため画面に出すのではなく、ログファイルを見ることになるのだが、SQLの実行ログや各種デバッグログも出力されるので、人間の目ではどうしても見逃してしまう。
ならばイイ感じの通知システムを作ってしまえばいいのである。
動作環境
■サーバー側
- CentOS 6.3(※tailコマンドでPHPのログファイルを参照できる環境ならなんでもよい)
- SSH接続ができる状態
■クライアント側
- Windowsマシン(7、10で確認済み)
- TeraTerm
- WebMail Notifier(http://dreamcheeky.com/webmail-notifier)
※おそらく今からだと入手困難・・・
こんな感じで新着メールを教えてくれるUSBガジェット
■通常時
■メール着信時
動作イメージ
- クライアント側からTeraTermでサーバー側(SSH)へログインをする。
- PHPのログファイルを「tail -f php.log」というように表示させておく。
- WEBアプリを動かす。
- エラーメッセージがPHPのログファイルに吐かれ、クライアント側にUSBで接続してある「WebMail Notifier」が光ってお知らせ!
- デバッグして、めでたしめでたし。
実現するための準備
まず、「PHPのログファイルにエラーメッセージが吐かれた」というのをどうやって検知するかだが、
TeraTermには便利なマクロ機能が備わっているので、それを使用する。
■TeraTermマクロ
※拡張子を「ttl」で保存する。
SERVER = '接続先' ; 書き換えてください。
PORT = '22' ; SSHのポートが違う場合は書き換えてください。
USER = 'ユーザー名' ; 書き換えてください。
PASS = 'パスワード' ; 書き換えてください。
LOGFILE_PATH = '/var/log/php/error.log' ; PHPのログファイルのパスです。
WEBMAIL_NOTIFIER_PATH = 'C:\webmailwindow\webmailwindow.exe' ; webmailwindow.exeのパスです。
msg = SERVER
strconcat msg ':'
strconcat msg PORT
strconcat msg ' /ssh /auth=password /user='
strconcat msg USER
strconcat msg ' /passwd='
strconcat msg PASS
connect msg
wait '$'
sendln 'pwd'
command = 'tail -f '
strconcat command LOGFILE_PATH
sendln command
show -1
tz="GMT"
gettime s "%Y/%m/%d %H:%M:%S" tz
res = 0
while 1
; TeraTermを終了させたらマクロも終了させる。
testlink
if result=0 then
exit
endif
; 警告メッセージが現れるのを待つ。
wait 'PHP Fatal error:' 'PHP Notice:' 'PHP Warning:' 'PHP Parse error:' 'query error'
res = result
color = "rgb"
if result=1 then
; PHP Fatal errorの場合
color="r"
elseif result=2 then
; PHP Noticeの場合
color="g"
elseif result=3 then
; PHP Warningの場合
color="rg"
elseif result=4 then
; PHP Parse errorの場合
color="b"
elseif result=5 then
; SQL実行エラーの場合
color="gb"
endif
; 1秒以内に連続して発生した場合は無視する。
gettime now "%Y/%m/%d %H:%M:%S" tz
strcompare s now
if res!=0 then
if result!=0 then
sprintf2 cmd_str '%s -c %s' WEBMAIL_NOTIFIER_PATH color
exec cmd_str
s = now
endif
endif
endwhile
このマクロはサーバーへのログインをした後に「tail -f php.log」までの操作を自動で行う。
また、エラーメッセージがログファイル上に現れたタイミングで「webmailwindow.exe」を実行させる。
次にWebMail Notifierを光らせるためのプログラムを入手する。
https://github.com/forest-soft/webmailwindow
自分でビルドするか、「webmailwindow.exe」をダウンロードする。
実際に動かしてみる
- TeraTermマクロを実行し、サーバーへログイン & tail & エラーメッセージ待ち受け状態にする。
- WEBアプリを動かしてエラーメッセージを吐かせる。
- WebMail Notifierが光ってお知らせしてくれた!
今回の方法はTeraTermからexeファイルを実行しているだけなので、
WebMail Notifierに限らず別のUSBガジェットだろうが、メール送信プログラムだろうがなんでも良い。
エラーメッセージは嫌なものだが、光ってお知らせしてくれるとちょっとうれしくなったりもする。
いろいろと工夫していきたいものである。