我知道如果未设置error_log
配置指令,则会将错误发送到SAPI错误记录器。例如,它是Apache中的错误日志或CLI中的stderr。
因此,如果我从命令行运行脚本,则会直接显示错误(除非重定向)。如果我从cron运行脚本,则会将错误通过电子邮件发送给cron作业所有者。那么如果我将电子邮件发送到脚本会发生什么呢?
我刚刚开始编写脚本来处理退回邮件。我已经读过,如果脚本输出任何内容,它将反弹回发件人。我不确定这是应用于所有输出还是仅适用于STDOUT。或者STDERR在CLI中是否等于STDOUT?
如果我将error_log
配置指令设置为文件,我是否可以使用trigger_error
和error_log
函数安全地输出错误消息,而不会向发件人发送退回信息?
由于脚本正在处理退回,我真的希望避免回弹给发件人。我想这可能导致无限循环。并且由于错误日志位于另一个目录中,并且路径是在包含文件中设置的,因此在设置配置指令之前,可能会出现远程错误。在脚本的最顶部使用ini_set('error_log', 'syslog')
然后尽快将其更改为我的文件是不是一个好主意?
答案 0 :(得分:7)
使用CLI时,stdout
和stderr
都会转到同一个地方。对于cron,输出通过电子邮件发送给cron作业所有者。对于命令行,输出发送到终端。将一个程序的输出传递给另一个程序(通过管道)时,输出返回到第一个程序。它的作用取决于程序。
使用CLI指定错误的最简单方法是在命令行中指定错误。因此,如果将电子邮件发送到脚本,您可以使用以下内容:
| /usr/bin/php /path/to/script/script.php 2> /path/to/log/error.log
数字2
是stderr
的文件句柄,>
将其重定向到指定文件。
对于不同的PHP配置指令,它们对CLI的行为有所不同。显然,某些版本/系统上存在一个错误,无论配置设置如何,都不会将错误写入日志。
以下是在我的系统上使用CLI进行测试的结果(Centos 6上的PHP 5.3):
log_errors
设置为 0 不会阻止显示错误。错误与display_errors
的位置相同,除非在命令行上重定向。stdout
关闭且log_errors
关闭,则不会报告任何错误。display_errors
on 且log_errors
设置为文件(具有适当的权限),则错误会转到该文件。error_log
并且log_errors
设置为' syslog' ,那么错误将转至/ var /日志/消息。error_log
,则会输出两条错误消息:一条带有' PHP'前缀和一个没有。log_errors
设置为 1 并将其设置为' stderr' 之间的唯一区别是前者打印出来的额外的换行。请注意,我只在命令行测试了不同的配置指令,而不是cron或管道到另一个程序。我想结果将是相同的,因为它们都是CLI。唯一的区别是display_errors
的位置。
您可以允许邮件转到邮箱,而不是担心输出可能会返回给发件人。然后使用PHP imap函数来读取邮件。 PHP脚本可以作为cron作业运行,然后任何错误消息都将发送给cron作业所有者。