5

さて、もう少し詳しく調べてみると、これはばかげた質問であり、間違っていることがわかりました。私が保守しているレガシー コードの作成者が、php_initステートメントを使用してエラー ログを別のファイルにハイジャックしていたことが判明しました。出力バッファリングがオンになると同時にハイジャックが発生したため、出力バッファリングがエラー メッセージを破棄しているように見えました。

では、モデレーターさん、これは削除していただいてもかまいません。誠意を持って答えてくれた人に感謝します。


次の PHP スクリプトがあるとします。

<?php 
error_log('test'); 

ob_start();

error_log('test2');

ob_end_flush();
?>

次のエラー ログ出力が表示されます。

[04-Feb-2010 11:30:38] test

出力バッファリングがエラー メッセージを大量に消費するのはなぜですか? どうすればやめさせることができますか?

または、出力バッファからメッセージを密輸する別の方法はありますか?それとも単なるブラック ホールですか?

(PHPを使用5.2.4-2ubuntu5.10

4

2 に答える 2

7

例外が ob_start() シールドを貫通

PHP スクリプトの実行を停止する場合は、ob_start()、ob_end_flush() シールドを貫通するExceptionをスローします。

echo 'before output buffer';
ob_start();
throw new Exception('this will be seen');
ob_end_flush();

Logger クラスの作成を検討する

メソッドで直接出力しないでください。むしろholder、ログを組み込んだクラスまたはを使用してください(またはerrorあなたの場合はメソッド)。

class Logger
{
    private $_messages = array();

    public function __construct()
    {
        $this->_messages['errors'] = array();
        $this->_messages['debug'] = array();
    }

    public function error($msg)
    {
        $this->_messages['errors'][] = $msg;
    }

    public function debug($msg)
    {
        $this->_messages['debug'] = $msg;
    }

    public function getErrors()
    {
        return $this->_messages['errors'];
    }

}

$logger = new Logger();

$logger->error('error1');

ob_start();

$logger->error('error2');

ob_end_flush();

print_r($logger->getErrors());

このようにして、ホルダーオブジェクトに依存できます。メッセージを破棄せず、表示したいすべてのエラーを取得します

于 2010-02-04T17:51:56.047 に答える
0

実際にこれを行ったことはありませんが、これはうまくいくはずです:

error_log() の周りにラッパーを構築する必要があります

  1. ob_get_contents() を使用してバッファリングしている出力を格納します
  2. ob_clean() を使用して出力バッファを消去します
  3. エラーメッセージを書き出して ob_flush()es する
  4. echo() を使用して保存された出力を書き戻します
于 2010-02-04T17:42:16.097 に答える