0

cron サービスを使用して毎晩 PHP スクリプトを実行しています。それが出力するものはすべて、デバッグの前提としてログ ファイルに出力されます。私が使用するファイルは、関数「file_get_contents()」を使用して別のサイトから xml を取得します。しかし、関数は、既にカスタム エラーを表示しているため、実際には表示したくないエラーを返す可能性があります。

私のコードの簡単な例:

$buffer = @file_get_contents('http://xx:xx@xx/xml/xx?offset=2') or print('retry in 5 seconds');

if($buffer === false) {
  sleep(5);
  $buffer = @file_get_contents('http://xx:xx@xx/xml/xx?offset=2') or print('error notice');
}

問題は、最初のエラーがトリガーされ、5 秒後に再試行されることです。スローされたエラーを正しく抑制するにはどうすればよいですか?

エラーハンドラーはありますが、このエラーを個別にキャッチしたくありません。

編集: 私の解決策は、error_reporting を変更することではなく、エラー メッセージをキャッチすることでした。「file_get_contents()」で始まる場合、エラーはスローされません。これは最善の方法ではありませんが、私のために仕事をします。

4

3 に答える 3

2

これを最初に挿入してみてください:

error_reporting(0);

次に、エラー/警告のあるコードの後:

error_reporting(E_ALL ^ E_WARNING);
于 2012-08-02T08:07:29.190 に答える
1

@-演算子は絶対に使用しないでください。

PHP では、カスタム エラー ハンドラを使用するか、try/catch を使用するかの 2 つのオプションを使用できます。

file_get_contents は例外をスローしないため、最初の方法しか使用できません。

http://php.net/set-error-handlerのようにエラー ハンドラーを設定してから、正しく動作します (何かをログに記録するか、カスタム エラー コードを返します)。

すべてのエラーをerror_reporting(0)無効にしたい場合、または特定のカテゴリの使用を無効にしたい場合error_reporting(E_ALL ^ E_WARNING)(警告以外のすべて)、またはそれらを明示的に指定した場合error_reporting(E_WARNING | E_NOTICE)(警告と通知) を使用します。

無効にするだけでは、コードで何が起こっているのかわからなくなるため、最初のアプローチを好みます。

于 2012-08-02T08:11:43.000 に答える
0

コマンドの前に @ を追加するか、try catch を使用します。

于 2012-08-02T08:06:02.847 に答える