Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中写入到STDERR的内容到哪里去了?_Php_Error Handling_Stderr - Fatal编程技术网

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

在PHP中写入到STDERR的内容到哪里去了?,php,error-handling,stderr,Php,Error Handling,Stderr,我知道,如果未设置error\u log配置指令,则会将错误发送到SAPI错误记录器。例如,它是Apache中的错误日志或CLI中的stderr 因此,如果从命令行运行脚本,错误将直接显示(除非重定向)。如果我从cron运行脚本,错误将通过电子邮件发送给cron作业所有者。那么,如果我将电子邮件传输到脚本会发生什么 我刚开始写一个脚本来处理反弹消息。我已经读到,如果脚本输出任何内容,它将返回给发送者。我不确定这是否适用于所有输出或只是标准输出。或者STDERR是否等于CLI中的STDOUT 如果

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

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

我刚开始写一个脚本来处理反弹消息。我已经读到,如果脚本输出任何内容,它将返回给发送者。我不确定这是否适用于所有输出或只是标准输出。或者STDERR是否等于CLI中的STDOUT

如果我将
error\u log
configuration指令设置为一个文件,那么我是否可以使用
trigger\u error
error\u log
功能安全地输出错误消息而不向发送方发送反弹


由于脚本正在处理反弹,我真的希望避免反弹回发送方。我想这会导致一个无限循环。由于错误日志位于另一个目录中,并且路径设置在一个include文件中,所以在我设置配置指令之前,很可能会出现一些错误。在脚本的最顶端使用
ini\u set('error\u 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中的行为确实不同。显然,在某些版本/系统上存在一个bug,无论配置设置如何,错误都不会写入日志

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

  • 如果启用了
    log\u errors
    ,则将
    display\u errors
    设置为0不会停止显示错误。除非在命令行上重定向,否则错误将与标准输出(stdout)位于同一位置
  • 如果
    log\u errors
    处于关闭状态,并且
    display\u errors
    处于关闭状态,则不会报告任何错误
  • 如果启用了
    log\u errors
    ,并且将
    error\u log
    设置为文件(具有适当的权限),则错误将转到该文件
  • 如果启用了
    log\u errors
    ,并且
    error\u log
    设置为“syslog”,则错误将转到/var/log/messages
  • 如果启用了
    log_errors
    ,并且启用了
    display_errors
    ,则会输出两条错误消息:一条带有“PHP”前缀,另一条没有
  • 我能看到的唯一区别是将
    display\u errors
    设置为1和将其设置为'stderr',前者打印了一个额外的换行符
注意,我只在命令行测试了不同的配置指令,而不是cron或管道到另一个程序。我想结果是一样的,因为它们都是CLI。唯一的区别是
stdout
的位置

可供替代的
您可以允许邮件进入邮箱,而不必担心返回给发件人的输出是什么。然后使用PHP函数读取邮件。PHP脚本可以作为cron作业运行,然后任何错误消息都会发送给cron作业所有者。

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