3

我知道如果error_log未设置配置指令,则会将错误发送到 SAPI 错误记录器。例如,它是 Apache 中的错误日志或 CLI 中的 stderr。

因此,如果我从命令行运行脚本,则会直接显示错误(除非重定向)。如果我从 cron 运行脚本,错误会通过电子邮件发送给 cron 作业所有者。那么如果我通过管道将电子邮件发送到脚本会发生什么?

我刚开始编写一个脚本来处理退回消息。我已经读过,如果脚本输出任何内容,它将反弹回发件人。我不确定这是否适用于所有输出或仅适用于 STDOUT。或者 STDERR 在 CLI 中是否等于 STDOUT?

如果我将error_log配置指令设置为文件,那么我可以使用trigger_errorerror_log函数来安全地输出错误消息而不向发件人发送退回邮件吗?

由于脚本正在处理退回,我真的想避免退回给发件人。我想这可能会导致无限循环。而且由于错误日志位于另一个目录中,并且路径是在包含文件中设置的,因此在我设置配置指令之前,很可能会出现问题。ini_set('error_log', 'syslog')在脚本的最顶部使用然后尽快将其更改为我的文件会是一个好主意吗?

4

1 回答 1

7

使用 CLI 时,两者都stdoutstderr同一个地方。对于 cron,输出通过电子邮件发送给 cron 作业所有者。对于命令行,输出被发送到终端。当将一个程序的输出传递给另一个程序(通过管道)时,输出将返回给第一个程序。它的作用取决于程序。

使用 CLI 时指定错误发生位置的最简单方法是在命令行上指定它。因此,如果将电子邮件通过管道传输到脚本,您可以使用以下内容:

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

该数字2是文件句柄,stderr并将其>重定向到指定文件。

PHP 配置指令

至于不同的 PHP 配置指令,它们对于 CLI 的行为确实不同。显然,在某些版本/系统上存在错误,无论配置设置如何,错误都不会写入日志。

以下是在我的系统上使用 CLI 进行测试的结果(Centos 6 上的 PHP 5.3):

  • 如果log_errorson,设置display_errors0将不会停止显示错误。stdout除非在命令行上重定向,否则错误与 相同。
  • 如果log_errorsoffdisplay_errorsoff,则根本不报告任何错误。
  • 如果打开并设置log_errors为文件(具有适当的权限),则错误会转到该文件。error_log
  • 如果打开并设置为log_errors' syslog',则错误转到 /var/log/messages。error_log
  • 如果log_errorsis ondisplay_errorsis on,会输出两条错误消息:一条带有 'PHP' 前缀,一条没有。
  • 我可以看到设置display_errors1和设置为'stderr'之间的唯一区别是前者打印了一个额外的换行符。

请注意,我只在命令行测试了不同的配置指令,而不是 cron 或通过管道传输到另一个程序。我想结果会是一样的,因为它们都是 CLI。唯一的区别是去哪里stdout

选择

与其担心什么输出可能会返回给发件人,您可以允许邮件进入邮箱。然后使用 PHP imap函数读取邮件。PHP 脚本可以作为 cron 作业运行,然后任何错误消息都会发送给 cron 作业所有者。

于 2013-07-06T13:07:43.420 回答