xxhiroxx_chanさん
(1)エラーを補足しなかった場所(=exitを明記しなかった場所)でエラーが起こったためphp.exeプロセスが終了しなかった、というのは正しい解釈なのでしょうか?
PHPでスクリプト実行が停止するような致命的エラーの発生時は強制終了されます。
ですので、終了しなかったのは別問題(例えば、無限ループ、ODBC接続終了の無限待ち)ではないかと推察されます。
もし指定時間内でプログラムを終了させなければならないのでしたら、以下の手段があります。
set_time_limit 関数
(2)php.iniの設定等によりエラー捕捉できなくてもphp.exeを強制的に終了する方法、または例えば、VBで使われるon error go to ・・・のようにどこでエラーが起こっても処理をある場所に飛ばす方法、などにより、今回のようなことを回避できないでしょうか?
PHPにはエラー/例外それぞれを取得できるよう、以下のようなハンドラがあります。
set_error_handler 関数
set_exception_handler 関数
PHP
1 function custom_error_handler($errno, $errmsg, $errfile, $errline, $errcontext) {
2 # エラーログ処理
3 # ・エラーコード:$errno
4 # ・メッセージ :$errmsg
5 # ・対象ファイル:$errfile
6 # ・対象行番号 :$errline
7 # ・オプション :$errcontext
8 }
9 function custom_exception_handler($exception) {
10 # エラーログ処理
11 # ・例外コード :$exception->getCode()
12 # ・メッセージ :$exception->getMessage()
13 # ・対象ファイル:$exception->getFile()
14 # ・対象行番号 :$exception->getLine()
15 # ・例外クラス名:get_class($exception)
16 }
17 set_error_handler("custom_error_handler");
18 set_exception_handler("custom_exception_handler");
また、PHPではエラーレベルが非常に高い(いわゆる致命的なエラー)場合にスクリプトが強制終了する為、上記2つの関数でキャッチする事ができません。
この場合には以下のハンドラを使ってPHP終了を検知して処理する必要があります。
register_shutdown_function 関数
上記で設定された関数は強制終了時にも実行されますので、
error_get_last 関数
を使ってE_PARSE等の高レベルエラーを判定して処理させる事が可能です。
PHP
1function custom_error_checker() {
2 $error = error_get_last();
3 if ($error["type"] == E_PARSE ||
4 $error["type"] == E_ERROR ||
5 $error["type"] == E_CORE_ERROR ||
6 $error["type"] == E_CORE_WARNING ||
7 $error["type"] == E_COMPILE_ERROR ||
8 $error["type"] == E_COMPILE_WARNING) {
9 # エラーログ等の処理
10 # :
11 }
12}
13register_shutdown_function("custom_error_checker");
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/07 06:18