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