我知道如果未设置 error_log
配置指令,则会将错误发送到 SAPI 错误记录器。例如,它是 Apache 中的错误日志或 CLI 中的 stderr。
因此,如果我从命令行运行脚本,则会直接显示错误(除非重定向)。如果我从 cron 运行脚本,错误将通过电子邮件发送给 cron 作业所有者。那么如果我通过管道将电子邮件发送到脚本会发生什么?
我刚刚开始编写脚本来处理退回邮件。我读过,如果脚本输出任何内容,它将退回给发件人。我不确定这是否适用于所有输出或仅适用于 STDOUT。或者 STDERR 是否等于 CLI 中的 STDOUT?
如果我将 error_log
配置指令设置为文件,那么我可以使用 trigger_error
和 error_log
函数来安全地输出错误消息而不向发件人发送退回邮件吗?
由于脚本正在处理退回邮件,我真的很想避免退回给发件人。我想这可能会导致无限循环。而且由于错误日志在另一个目录中并且路径是在包含文件中设置的,所以在我设置配置指令之前很可能会出现问题。在脚本的最顶部使用 ini_set('error_log', 'syslog')
然后尽快将其更改为我的文件是个好主意吗?
最佳答案
使用 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 的行为确实不同。显然,在某些版本/系统上存在一个错误,无论配置设置如何,错误都不会写入日志。
以下是在我的系统上使用 CLI 进行测试的结果(Centos 6 上的 PHP 5.3):
log_errors
打开,将 display_errors
设置为 0 不会停止显示错误。除非在命令行上重定向,否则错误会出现在与 stdout
相同的位置。 log_errors
关闭且 display_errors
关闭,则根本不会报告任何错误。 log_errors
打开并且 error_log
设置为文件(具有适当的权限),则错误将转到该文件。 log_errors
打开并且 error_log
设置为“syslog”,则错误将转到/var/log/messages。 log_errors
和 display_errors
都打开,则会输出两条错误消息:一 strip 有“PHP”前缀,另一条没有。 display_errors
设置为 1 和将其设置为 'stderr' 之间我能看到的唯一区别是前者打印了一个额外的换行符。 请注意,我只在命令行测试了不同的配置指令,而不是 cron 或管道到另一个程序。我想结果会是一样的,因为它们都是 CLI。唯一的区别是
stdout
的位置。选择
与其担心什么输出可能会返回给发件人,您还可以允许消息进入邮箱。然后使用PHP imap 函数读取邮件。 PHP 脚本可以作为 cron 作业运行,然后任何错误消息都会发送给 cron 作业所有者。
关于php - 在 PHP 中写入 STDERR 的内容去哪儿了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17485430/