1

ええと...これは私の場合です:私はフレームワークを開発していて、現在エラー処理機能を開発しています。エラー処理エラーも処理したい!よく説明します。致命的かどうかに関係なく、エラーが発生した場合、例外がスローされ(致命的でないエラーの場合)、致命的なエラーの例外が偽造されます。例外は「ロガー」によって処理されます。ロガーは、エラーを処理してコンソール(ブラウザー)にエコーしたり、ファイルに保存したりできます。問題は、ロガー内で2番目の致命的なエラーが発生した場合です。それをキャッチするために、PHPバッファー(ob_start())を使用しています。この関数の内部では、エラーが発生することはありません。つまり、これはエラートレースの最後のレベルです。エラーをエコーすることもできますが、PHPエラーログシステムを使用して登録したいと思います(最後のレベルに達しない場合は無効にします)。これは、error_log関数を使用して可能です。

「成功した場合はTRUEを返し、失敗した場合はFALSEを返します。」

ええと...これは私が必要なものです。しかし、この関数が致命的なエラー(内部実装)を生成する可能性があるのか​​、それとも単にTRUE / FALSEを返す可能性があるのか​​わからないため、恐れています。ローカルホストSMTPでメールオプション(1)を使用してテストしましたが、これは(予想どおりに)失敗し、警告メッセージが生成されました。次に、バッファがクラッシュし、ブラウザに空白のページが表示されます(これは私が望まないことです)。この問題は、fsockopenとのSMTP接続をチェックし、戻り値をクラス変数に関連付けることで解決できます。バッファ関数内で、この変数値が検証されます。がTRUEの場合、emailオプション付きのerror_logが呼び出されます。しかし、オプション0(phpファイルログ)と3(他のファイル)のerror_logの場合はどうでしょうか?

これは私のロギングクラスの関連部分になります:

    public function error_buffer($buffer) {

        $error = error_get_last ();

        if ($error && ($error ['type'] & E_FATAL && $this->_errhe)) {

            $this->error_handler_error ( $error ['type'], $error ['message'], $error ['file'], $error ['line'] );

            if (ENV === 'production') {
                return 'error 500';
            }

            return ob_get_contents ();

        }

        return $buffer;

    }

    public function error_handler_error($errno, $errmsg, $errfile, $errline) {

            var_dump ( $errfile );

            /* GENERATES WARNING MESSAGE... AND BLANK PAGE! 
             *  Here is possible to do: if($this->_email) { error_log() }...
            */
            @error_log ( $errmsg, 1, 'lucas@lucas.com' );

            // error_log($errmsg, 0);

    }
4

1 に答える 1

2

@ はエラーの発生を止めるものではなく、表示されるのを止めるだけです。したがって、mail() が失敗した場合、error_log からメールへ (オプション 1) も失敗し、エラーが発生します。

したがって、おそらく起こっていることは、error_log() 呼び出しがエラー処理関数を呼び出すエラーを引き起こし、それがエラー処理関数を呼び出すエラーを引き起こす error_log() を呼び出すことです。 error_log() を呼び出してエラーを発生させるエラー処理関数....要点がわかります。

その場合、私がすぐに考えることができる解決策は次のとおりです。

1 - error_buffer に静的変数を含めて、「現在エラーを処理しています。これ以上処理しないでください (または単にメッセージを画面に表示します - ただし、ini 設定の "display_errors" を尊重します)。

2 - エラー関数でデフォルトの PHP 関数が処理するときに、エラー処理をオフにします。

「error_log ( $errmsg, 1, 'lucas@lucas.com' );」に電話してみませんか? エラー関数の外側で (@ なしで)、エラー ハンドラが呼び出されているかどうかを確認します。

于 2012-05-16T01:34:00.783 に答える