CakePHPでdebug=0の際にset_error_handler
Configure::write('debug', 0);に設定すると、エラーとかが全く出力しなくなるので、ちょっと困った場合があります。
本番にファイルをアップしたら、いざ画面が真っ白になったり、原因不明で設定したシステムエラーページに飛んだりすると、本当にドキドキします。しかも、意図的に投げたエラーだったら、まだカスタマログから調べられますが、普通のwaningとかphpエラーだったら、サーバー上PHPが吐き出したエラーログしか調べられません。
そこで、debug=0の際にカスタマエラーハンドリングを設定してみました。
Step1 /app/custom_error_handler.php (下記のファイル)を作成する
class CustomErrorHandler extends Object { function &getInstance() { static $instance; $instance =& new CustomErrorHandler(); return $instance; } function setup(&$debugger) { if(Configure::read() == 0) { set_error_handler(array(&$debugger, '_error_handler')); } } function _error_handler() { list($number, $message, $filename, $line, $vars) = func_get_args(); $errorType = array ( E_WARNING => 'Warning', E_USER_ERROR => 'User Error', E_USER_WARNING => 'User Warning', ); if ( in_array($number, array(E_NOTICE, E_USER_NOTICE, E_STRICT)) ) { return true; } $type = $errorType[$number]; if ( ! $type ) { $type = 'Unknown(' . $number . ')'; } $err = $type . ' - ' . $message . ' - ' . $filename . '(' . $line . ')'; $this->log($err,"php_error"); } }
Step2 /app/config/bootstrap.php に下記の記述を追記します
#本番モードの際のカスタマエラーハンドリング設定 require_once APP.'custom_error_handler.php'; CustomErrorHandler::setup(CustomErrorHandler::getInstance());
そうすると、debug=0の本番モードでも、/app/tmp/log/php_error.phpにちゃんと役に立ちそうなログを残してくれます。
あともうひとつの方法があります
/app/config/bootstrap.phpの中にphpエラーログを常に/app/tmp/log/php_error.logに出力するとか
例えば:
if ( Configure::read('debug') == 0 ) { error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED); ini_set('display_errors', 0); ini_set('log_errors', 1); ini_set('error_log', LOGS . DS . 'php_error.log'); }
で、独自のエラーハンドリングを設定したい場合はStep1とStep2の方法を使ってください。
【注意】二つの方法が併用できません!