【问题标题】:Where does content written to STDERR in PHP go?用 PHP 写到 STDERR 的内容到哪里去了?
【发布时间】:2013-07-03 08:28:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • “将电子邮件传送到脚本”是什么意思?
  • 使用| /path/to/php /path/to/script 将收到的电子邮件(针对特定地址)发送到脚本。该脚本将读取 STDIN 以获取传入的电子邮件。
  • 我想你会使用一个自定义的 POP 客户端,它将你的邮箱内容回显到stdout
  • 邮件不会发送到邮箱,因为它是通过 qmail 传送到脚本的。没有邮箱。地址是别名。该脚本将解析电子邮件以获取一些信息并将一些内容存储到数据库中。

标签: php error-handling stderr


【解决方案1】:

使用 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):

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

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

另类

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-23
    • 2013-01-14
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多