エラーメッセージに慣れよう

throw new Exception

主に、PHPとWordPressの話です。

メッセージには何が書かれているのか?

  • エラーの概要:
    1. 発生した日時(ログ出力した場合)
    2. PHPの実行エンジンによる警告、文法エラー、致命的エラー
    3. ユーザーが書いたプログラムによる、例外やエラー
  • エラーの発生場所(スタックトレース)

が書かれています。

サイトの攻撃者に情報を与えない

公開サーバーではエラーや警告を画面に表示させないようにすることが原則です。
なぜなら、その情報から処理コードや実行環境やソフトウェアバージョンを推測されてしまい、攻撃成立につながることがあるからです。
仮に、公開サーバーでエラー特定のため、エラーの画面表示を有効にする場合でも、問題が解決したら画面表示はOFFに戻してください。

エラー表示のおすすめは以下のようなルールです:
– ローカル環境の開発サーバーでは全てのエラーを画面表示させる
– 公開サーバーではエラーや警告はログファイルに出力し、別途監視ツールで一定期間ごとにメール通知させ、不具合を検出する

具体的な方法、例えばサーバーを攻撃者から守る方法や脆弱性の検出方法は別な章でご説明いたしますので、
本記事では、上記の説明にのみに留めます。


エラーのレベル(種類)

Notice

スクリプトを停止するほどではないエラーの場合は、以下のように警告が出ます。

上は未定義の(define関数によって定義されてない)定数を使用している場合に表示される警告です。
PHPのプラグインによっては、Noticeレベル

Warning

Notice同様 警告を意味し、実行は停止しませんが、こっちのほうが緊急性は高いです。
本番環境でWarningが出た場合は、なるべく速く対応策を考えて修正したほうがよいでしょう。
理由は、表面的には問題ないように見えても、実は裏で徐々に不具合が拡大していくような事象につながることがあるからです。

例えば、決済システムの価格の計算で、上記のような0除算の警告があった場合、本来はエラー処理をおこなうか、または処理を停止すべきところを、Warningにより処理が継続して、DBに不正な値が保存されてしまう。といったことが考えらるからです。

文法エラー (PHP Parse error)

セミコロン抜け、括弧の閉じ忘れや、キーワードの誤りなどで発生するエラーです。
PHPの実行時に文法エラーがあれば、処理は停止します。

php syntax error

xdebugが有効になっていれば、上図のように、スタックトレースによって発生箇所を特定することが容易です。

致命的エラー (PHP Fatal error)

メッセージ例: 存在しないメソッドを呼び出した場合

致命的なエラーは、ウェブサービスを継続できない状態なので、すぐさま対応しないといけないやつです。

廃止済み関数/変数の使用(PHP Deprecated)

実行してるPHPのバージョンによりますが、そのバージョンで既に廃止された関数などを使用した場合に出る警告です。

エラーメッセージはどこに出力されるのか?

  • 画面にそのまま出力される
  • ログファイルに出力される
  • 開発ツールに出力される

ローカル環境での開発時はエラーメッセージを常に表示させるように設定する

以下のようにして画面表示を有効にすることができます。(ただし公開サーバーでは画面表示は原則禁止です)

また、 wp-config.php で以下のようにすることで:

wp-content/debug.log にログを出力させることができます。
WordPressのデバッグ方法については WordPressのデバッグ にて詳細に説明いたします。

エラーを解消するには?

検索する前にやること:

発生場所を特定する

大まかにいって、以下の4つの方法で特定することができます。

  • スタックトレースを見る(あれば)。
  • 発生源付近の前の行でexitして止めてみる。または発生源付近をばっさり削除してエラーがでるかどうか試してみる。
  • xdebugを使ってラインデバッグする。

エラー修正とテスト

エラーを修正できたら、すぐにアップロードするのではなく、修正箇所をテストしてみましょう。
一般的には単体テストという工程に該当します。WordPressで単体テストを導入するには、PHPUnitを使います。
PHPUnitはWordPressに限らず、どんなPHPでもテストできる柔軟性をもったテストのためのフレームワークです。
(「テストする」 とはテストケースをPHPコードで記述して、それを実行することを意味します)

PHPUnitをWordPressに導入する方法については、 WordPressとPHPUnit を参照してください。

Filed under: ウェブ開発入門

No comment yet, add your voice below!


Add a Comment

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください