在PHP中写入STDERR的内容在哪里?

时间:2013-07-05 09:22:34

标签: php error-handling stderr

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

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

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

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

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

1 个答案:

答案 0 :(得分:7)

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

使用CLI指定错误的最简单方法是在命令行中指定错误。因此,如果将电子邮件发送到脚本,您可以使用以下内容:

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

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

PHP配置指令

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

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

  • 如果<{1}} ,则将log_errors设置为 0 不会阻止显示错误。错误与display_errors的位置相同,除非在命令行上重定向。
  • 如果stdout 关闭log_errors 关闭,则不会报告任何错误。
  • 如果display_errors on log_errors设置为文件(具有适当的权限),则错误会转到该文件。
  • 如果error_log 并且log_errors设置为&#39; syslog&#39; ,那么错误将转至/ var /日志/消息。
  • 如果error_log ,则会输出两条错误消息:一条带有&#39; PHP&#39;前缀和一个没有。
  • 我在将log_errors设置为 1 并将其设置为&#39; stderr&#39; 之间的唯一区别是前者打印出来的额外的换行。

请注意,我只在命令行测试了不同的配置指令,而不是cron或管道到另一个程序。我想结果将是相同的,因为它们都是CLI。唯一的区别是display_errors的位置。

替代

您可以允许邮件转到邮箱,而不是担心输出可能会返回给发件人。然后使用PHP imap函数来读取邮件。 PHP脚本可以作为cron作业运行,然后任何错误消息都将发送给cron作业所有者。