ええと...これは私の場合です:私はフレームワークを開発していて、現在エラー処理機能を開発しています。エラー処理エラーも処理したい!よく説明します。致命的かどうかに関係なく、エラーが発生した場合、例外がスローされ(致命的でないエラーの場合)、致命的なエラーの例外が偽造されます。例外は「ロガー」によって処理されます。ロガーは、エラーを処理してコンソール(ブラウザー)にエコーしたり、ファイルに保存したりできます。問題は、ロガー内で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);
}