読者です 読者をやめる 読者になる 読者になる

ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

PHPでのエラー解析方法について

こんにちわ! エンジニアの大塚です。 皆さんはコーディングの際に発生したwebアプリケーションエラーについてどのように解決してますか。 そんなものググればわかるだろ!とか、ログを見ればわかるだろ、という声が聞こえて来そうですが、、 (私も新卒のときに散々言われました。。) そもそもログの見方がわからない、ググり方がわからない人を対象に記事を書こうと思います。

はじめに

PHPでのアプリケーション開発(コーディング)の過程で発生するエラーを対象にしています。

エラーとは

コンピュータの動作におけるエラーには、プログラム自身の文法的な誤りによってそれ以上の処理が続行できない状態と、与えられたデータ(情報)に誤りがあり処理が続行できない場合、或いはオペレーティングシステム (OS) やコンピュータシステムがプログラムの要求に応じられない場合などに発生する。 プログラム上においてエラーとしての認識がなされていない不正な処理ルーチンをバグと言う。また、OSの停止を伴うものはフォルトまたはストールと言う。OSが停止していない場合には、OS側が持つエラー処理ルーチンから排出するエラー情報からバグを見つけられることもある。またOSが停止してもコアダンプなどファイルの形で静的データが保存されている場合は、これを手掛かりとして異常を調査することも可能である。 通常のプログラム開発においては、こういったエラーはエラートラップ(エラー処理とも・後述)と呼ばれる特別の関数(サブルーチン)が処理を引き継ぐよう設計される。エラートラップに引っ掛かったエラーは、予測されるエラーに対して、どうすれば解決できるかを予測できる範疇で対応する。 (wiki抜粋)

難しいことが書いてありますが、プリケーション開発の過程では主に「プログラム自身の文法的な誤り」か「データ(情報)に誤りがある」ことがほとんどです。

原因の特定

開発環境によってまちまちですが、まずはエラーログ(または画面上に表示される)を確認してみましょう。 以下のようにスタックトレースを確認することでどのような順番でプログラムが実行されたかがわかります。

#0 /var/htdocs/websites/sbdevel/public/index.php(70): seabird\test\C->exc()
#1 /var/htdocs/websites/sbdevel/public/index.php(85): seabird\test\C->doexc()
#2 /var/htdocs/websites/sbdevel/public/index.php(89): seabird\test\fail2()
#3 /var/htdocs/websites/sbdevel/public/index.php(93): seabird\test\fail1()
#4 {main}

大半のアプリケーションではフレームワークを採用していると思いますが、フレームワークのコードまで追うことは稀です。 ほとんどが自分で書いたコードや準備したデータが原因なのでそこを重点的に追っていきます。

フレームワークのコードの場合は主にフレームワーク名のフォルダ(cakephpなど)に纏まっているのですぐにわかると思います。

フレームワーク側でエラーが発生している場合は用意してあるクラス・メソッドの使い方(引数や実行順の間違いなど)や初期設定が間違っている可能性が高いので 使用しているフレームワークと同じバーション向けの公式マニュアルを確認しましょう。

また、既にシステムが稼働している場合、既存のコードをgrepして同じクラス・メソッドを使用している箇所を参考にしてみるのもいいと思います。 当たり前ですが同じ環境で動作しているコードのほうが他の要因を排除できるので原因にたどり着くのがはやいです。

続きは・・・

ブログ書いている途中で記事が結構なボリュームになることに気がついたので 来週、続きを書いていこうと思います。