9

私のプロジェクトでは、すべての PHP エラーをキャッチするために、次のようにエラー処理メカニズムを設定しました。

  1. ファイル内のすべてをオーバーライドするファイルに設定 しerror_reporting()ましたindex.phpphp.ini
  2. system/codeigniter/CodeIgniter.phpエラー ハンドラがusing に設定されてset_error_handlerいます - このエラー ハンドラ は_exception_handlersystem/codeigniter/Common.php
  3. _exception_handler関数はエラーを無視し、重大度が関数で 指定されたものである場合、例外システム ライブラリから関数E_STRICTを呼び出し、 ファイルに設定した内容に従ってエラーをログに記録します。show_php_errorerror_reporting()index.phpconfig.php
  4. FALSEこの PHP がエラーの処理を続行した後、ハンドラーはそう返しますが、通常はerror_reportingレベルとdisplay_errors設定に応じます。

私を困惑させているのは、E_ERRORエラー、つまり致命的なエラーがまったく検出されていないように見えることです_exception_handler。呼び出されていないだけshow_php_errorでなく、関数が呼び出されていないようです。show_php_errorこれは明らかに問題です。これは、それらが処理またはログに記録されないことを意味するためです。たとえば、意図的$this->load->views('foo');にコントローラーをタイプミスした場合、ハンドラーは呼び出されません。

エラー処理に関する提案は大歓迎です、ありがとう!

4

3 に答える 3

5

これは、致命的なエラーをキャッチする必要があるかどうかという、かなり大きな議論です。それらは致命的であると言う人もいるので、システムがどの状態であるかはわかりませんが、「エラーが発生した場合はクリーンアップを実行してみてください」と言います。すべての致命的なエラーをキャッチするには、pre_system フックをセットアップする必要があります。application/config/hooks.php に移動して入力します

$hook['pre_system'][] = array(
'class' => 'PHPFatalError',
'function' => 'setHandler',
'filename' => 'PHPFatalError.php',
'filepath' => 'hooks'
);

その後、hooks ディレクトリに移動し、エラーの処理を追加します。

<?php
    class PHPFatalError {

    public function setHandler() {
            register_shutdown_function('handleShutdown');
        }

    }

    function handleShutdown() {
        if (($error = error_get_last())) {
            ob_start();
                echo "<pre>";
            var_dump($error);
                echo "</pre>";
            $message = ob_get_clean();
            sendEmail($message);
            ob_start();
            echo '{"status":"error","message":"Internal application error!"}';
            ob_flush();
            exit();
        }
    }

ご覧のとおり、 register_shutdown_function を使用して、エラーが発生したかどうか、およびエラーが電子メールで開発者に送信されたかどうかをチェックする関数を実行しています。このセットアップは、私が取り組んできたいくつかの CI プロジェクトで 2 年以上問題なく機能しています。

于 2013-02-15T20:45:37.203 に答える
0

この回答は別の質問 ( https://stackoverflow.com/a/3675357 ) で見つけましたが、この質問を読んでいる人にも役立つと思います。「codeigniter 固有のエラー処理については、application/libraries フォルダーにMy_Exceptionクラスを作成することで、その 'Exception' ライブラリー クラスをオーバーライドできます。元のライブラリー関数のシグネチャーをそれにコピーして、コードに入れます。確実に機能します。」

于 2013-09-19T08:59:54.797 に答える