PHPで「Notice」や「Warning」が発生した際に"光"でお知らせする方法
2017年06月02日

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ガジェット
    ■通常時


    ■メール着信時

動作イメージ

  1. クライアント側からTeraTermでサーバー側(SSH)へログインをする。
  2. PHPのログファイルを「tail -f php.log」というように表示させておく。
  3. WEBアプリを動かす。
  4. エラーメッセージがPHPのログファイルに吐かれ、クライアント側にUSBで接続してある「WebMail Notifier」が光ってお知らせ!
  5. デバッグして、めでたしめでたし。

実現するための準備


まず、「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」をダウンロードする。


実際に動かしてみる

  1. TeraTermマクロを実行し、サーバーへログイン & tail & エラーメッセージ待ち受け状態にする。
  2. WEBアプリを動かしてエラーメッセージを吐かせる。
  3. WebMail Notifierが光ってお知らせしてくれた!


今回の方法はTeraTermからexeファイルを実行しているだけなので、
WebMail Notifierに限らず別のUSBガジェットだろうが、メール送信プログラムだろうがなんでも良い。
エラーメッセージは嫌なものだが、光ってお知らせしてくれるとちょっとうれしくなったりもする。
いろいろと工夫していきたいものである。

書いた人:木本

コメント一覧

コメントはまだありません。

コメントを投稿する

お名前
コメント
Top