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

php fatalエラーの補足方法

バッチがメモリ不足等で落ちた場合にFatalエラーが発生するけど通常fatalエラーはtry-catchはおろか、set_error_handlerでも補足できない。
そのためregister_shutdown_functionを使う必要がある。

<?php
register_shutdown_function('shutdown');
function shutdown(){
    // 最後のエラーを取得
    $error = error_get_last();
    if (empty($error)) {
        return;
    }
    if ($error['type'] == E_ERROR) {
        // Fatalエラー(E_ERROR)の場合の処理
    }
}

16/11/5追記
php5.2未満ではerror_get_last()が使用できない。php5.1.6の環境での代替案を調べてみたけど無さそうだったのであきらめるしかない。ちなみにerror_get_last()でFatalかどうか判定しないと通常にexitした場合との判別が出来ないのでerror_get_last()使えないとやっぱり困る。

17/1/31追記
今まで無条件にバッチ実行する際に標準出力を全部捨てていたんだけどこれを拾えばよかっただけの話だった。

* * * * * xx.sh > /dev/null 2>&1

これを辞めて

* * * * * xx.sh >> /../log/`date +\%m\%d`.log 2>&1

このような感じでログに出す

参考サイト
floatingdays: PHPで Fatal Error時の状況を調べる方法
[PHP]Fatal Error発生時にログを作成する | PHP Archive
PHP の「エラー処理ハンドラ」「シャットダウンハンドラ」「例外処理ハンドラ」の挙動 - Web/DB プログラミング徹底解説