Hatena::ブログ(Diary)

benny毎日ラボ

2010-04-27

CakePHPでdebug=0の際にset_error_handler

| 20:48

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の方法を使ってください。

【注意】二つの方法が併用できません!

トラックバック - http://d.hatena.ne.jp/bennylee/20100427/1272368893