PHP CLI不使用stderr输出错误

时间:2011-06-22 23:03:04

标签: stdout stderr php nstask

我正在通过MacOS中的NSTask运行PHP CLI,但这个问题更多的是关于CLI本身。

我正在收听stderr管道,但无论我尝试运行什么文件,都不会输出任何内容:

  • 如果文件类型不是纯文本,stdout设置为?
  • 如果文件是包含错误的php脚本,则错误消息仍会打印到stdout

是否可以通过stderr切换到解释器来处理错误?我是否可以选择检测除解析stdout之外的错误?

4 个答案:

答案 0 :(得分:19)

display_errors directive(可在任何地方设置)可选择使用参数“stderr”,以便向 stderr 报告错误,而不是 stdout 或完全禁用错误输出。引用PHP手册条目:

  

“stderr”将错误发送到 stderr 而不是 stdout 。该值从PHP 5.2.4开始提供。

或者,如果您正在使用命令行界面,并且想要输出自己的错误,则可以重复使用command-line nput/output streams

fwrite(STDERR, 'error message');

此处STDERR是已打开的 stderr 流。

或者,如果您只想为此脚本而不是在CLI中执行此操作,则可以打开php://stderr的文件处理程序并在那里写入错误消息。

$fe = fopen('php://stderr', 'w');
fwrite($fe, 'error message');

答案 1 :(得分:9)

如果您希望php解释器发送的错误消息应该转到stderr - 管道,您必须将display_errors设置为stderr

答案 2 :(得分:2)

这是从PHP领域返回到shell环境以便正确解析错误消息所必需的。您仍然需要退出(1)或任何整数,以便将退出状态代码从PHP返回到shell。

fwrite(STDERR, 'error message'); //output message into 2> buffer
exit(0x0a); //return error status code to shell 

然后,您的crontab条目将如下所示:

30 3 * * * /usr/bin/php /full/path/to/phpFile.php >> /logdir/fullpath/journal.log 2>> /logdir/fullpath/error_journal.log

答案 3 :(得分:1)

您还可以将 file_put_contents()“php:// stderr”一起输出到标准错误,例如:

php -r 'file_put_contents("php://stderr", "Hiya, PHP!\n"); echo "Bye!\n";' 1>/dev/null

在标准错误中输出“Hiya,PHP!\ n”,在Bash shell中执行时输出标准输出。