3

error_log構成ディレクティブが設定されていない場合、エラーが SAPI エラー ロガーに送信されることを理解しています。たとえば、Apache のエラー ログまたは CLI の stderr です。

そのため、コマンド ラインからスクリプトを実行すると、(リダイレクトされない限り) エラーが直接表示されます。cron からスクリプトを実行すると、cron ジョブの所有者にエラーが電子メールで送信されます。では、電子メールをスクリプトにパイプするとどうなるでしょうか。

バウンス メッセージを処理するスクリプトを書き始めたところです。スクリプトが何かを出力すると、送信者に跳ね返ることを読みました。これがすべての出力に適用されるのか、STDOUT だけに適用されるのかはわかりませんでした。または、STDERR は CLI の STDOUT と同じですか?

error_log構成ディレクティブをファイルに設定した場合、送信者にバウンスを送信することなくエラー メッセージを安全に出力する関数をtrigger_error使用できますか?error_log

スクリプトはバウンスを処理しているため、送信者にバウンスバックすることは避けたいと思っています。無限ループを引き起こす可能性があると思います。また、エラー ログは別のディレクトリにあり、パスはインクルード ファイルに設定されているため、構成ディレクティブを設定する前に問題が発生する可能性がほとんどありません。ini_set('error_log', 'syslog')スクリプトの一番上で使用して、できるだけ早くファイルに変更することをお勧めしますか?

4

1 に答える 1

7

CLI を使用する場合は、両方ともstdout同じstderr場所に移動します。cron の場合、出力は cron ジョブの所有者に電子メールで送信されます。コマンド ラインの場合、出力はターミナルに送信されます。あるプログラムの出力を (パイプを介して) 別のプログラムに渡す場合、出力は最初のプログラムに返されます。それが何をするかは、プログラムによって異なります。

CLI を使用するときにエラーが発生する場所を指定する最も簡単な方法は、コマンド ラインで指定することです。したがって、電子メールをスクリプトにパイプする場合は、次を使用できます。

| /usr/bin/php /path/to/script/script.php 2> /path/to/log/error.log

番号2はファイル ハンドルでstderrあり>、指定されたファイルにリダイレクトされます。

PHP 構成ディレクティブ

さまざまな PHP 構成ディレクティブに関しては、CLI では動作が異なります。どうやら、一部のバージョン/システムには、構成設定に関係なくエラーがログに書き込まれないというバグがあります。

私のシステム(Centos 6上のPHP 5.3)でCLIを使用してテストした結果は次のとおりです。

  • log_errorsonの場合、 0に設定display_errorsしてもエラーの表示は停止しません。コマンドラインでリダイレクトされない限り、エラーは と同じ場所に移動します。stdout
  • log_errorsoffdisplay_errorsであり、かつoffである場合、エラーはまったく報告されません。
  • log_errorsオンでファイルに設定されている場合error_log(適切なパーミッションで)、エラーはそのファイルに送信されます。
  • log_errorsオン'syslog'error_logに設定されている場合、エラーは /var/log/messages に送られます。
  • log_errorsondisplay_errorsonの場合、2 つのエラー メッセージが出力されます。
  • 1display_errorsに設定する場合と「stderr」に設定する場合の唯一の違いは、前者が余分な改行を出力したことです。

cron や別のプログラムへのパイプではなく、コマンド ラインでさまざまな構成ディレクティブのみをテストしたことに注意してください。それらはすべてCLIなので、結果は同じになると思います。唯一の違いは、どこにstdout行くかです。

どのような出力が送信者に返されるかを心配するのではなく、メッセージがメールボックスに送られるようにすることができます。次に、PHP のimap関数を使用してメールを読み取ります。PHP スクリプトを cron ジョブとして実行すると、すべてのエラー メッセージが cron ジョブの所有者に送信されます。

于 2013-07-06T13:07:43.420 に答える