php のエラーハンドリングは使用している環境の設定によって挙動が変わってくるので、Web上にあるコードを実行しても自分の環境だけ同じ結果にならなかったり、別の環境では異なる動きをして混乱することが多いです。
ここでは環境によってエラー時の動作が異なってくる部分を軽くまとめました。
はじめに
以下のような感じで -r につづいてコードを記述すると php コマンドから直接 php のスクリプトを実行することができます。
これを利用して今回は例を示していきたいと思います。
php -r 'phpinfo();'
これは phpinfo() 関数を実行するだけのスクリプトを実行するだけになります。
実際に結果を見ながら理解する
myfunc という関数を実行するスクリプトです。-d でパラメータが大量についてますが、それは環境によって動作が異なってくるのを防ぐために指定しているので、省略せずにそのままコピペして実行しましょう。
php -d log_errors=On -d error_reporting=-1 -d display_errors=Off -r "myfunc();"
ore@mypc:~/$ php -d log_errors=On -d error_reporting=-1 -d display_errors=Off -r "myfunc();"
PHP Fatal error: Call to undefined function myfunc() in Command line code on line 1
当然ですが、myfunc は定義されていないのでエラーになります
先程のスクリプトはいくつかパラメータがついていましたが、それが何か見ていきましょう。
指定していたパラメータについて
-d につづいて指定していたパラメータは通常 php の設定ファイル php.ini から設定されるものです。php.ini がどこにあるかは環境によって異なります。
php --ini を実行すると今どこにある php.ini ファイルが読み込まれているかどうかがわかります。
ore@mypc:~/$ php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File: /etc/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)
私の環境で実行してみました。上のケースでは /etc/php.ini が実際に読みこれている php.ini ファイルとなります。
Loaded Configuration File が (none)になっている場合は、設定ファイルがない状態なので php のデフォルト値が使用されている形になります。Configuration File Path のところに php.ini ファイルを作れば新たに設定することができます。
指定していたそれぞれのパラメータについて
log_errors
ここ に記載されているもので、エラーログを記録するかどうかを設定します。ドキュメントに書いてないですが、 cli モードから実行したときに標準エラーに出力だすかどうかというのも含まれているので ON にしないとエラー時に何も出力されません。なので必ず ON にします。
error_reporting
[ここ|http://php.net/manual/ja/errorfunc.configuration.php#ini.error-reporting|] に記載されているもので、エラー出力レベルを設定します。このパラメータは特に環境ごとに異なることが多いです。
mac のデフォルトで用意されている php では以下のような設定になっていました。
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
これは E_ALL から E_DEPRECATED と E_STRICT というタイプのエラーを取り除いたものをエラーとして取り扱う、という設定になりますが、あまり望ましくはないですね。できれば E_ALL だけにしたいものです。
先程のコマンドでは E_ALL とは書かず -1 と指定していましたが、これは意味としては E_ALL と同じものになります。ただ php 5.4 未満の環境では E_ALL を指定してもすべてのエラーは表示されず、-1 を指定するとすべてのエラーが表示されるという挙動だったので、-1 を指定しました。
display_errors
ここ に記載されているもので、エラーを出力するかどうかを指定します。 log_errors と似てますが、こちらはデフォルトでは標準出力出すとのことです。今回オフにしたのはこれオンにしていると log_errors の標準エラー出力と display_errors の標準出力の結果の両方が表示されてしまうからです。以下を御覧ください。
ore@mypc:~/$ php -d log_errors=On -d error_reporting=-1 -d display_errors=On -r "myfunc();"
PHP Fatal error: Call to undefined function myfunc() in Command line code on line 1
Fatal error: Call to undefined function myfunc() in Command line code on line 1
基本的にオフでも大丈夫ですが、以下のような Syntax Error になるようなコードを http サーバー経由で実行されるときに困ることがあります。
test(;
php -d log_errors=On -d error_reporting=-1 -d display_errors=Off -S localhost:12345 test.php
こんな感じの syntax error があるファイルを開いたときに何も表示されないので何が起こっているのかログみないとわからないので、開発環境のphp.iniだけONにしておいてコード上で ini_set('display_errors', 'Off'); としておくと良いと思います。本番環境のphp.iniはもちろんOffです。
まとめ
- php.ini に記載されている設定によってエラー発生時の挙動が変わる。
- 環境によって設定が異なるので手元で試すときは現在の設定に注意すること。