18

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

我正在听stderr管道,但无论我尝试运行什么文件,那里都没有输出:

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

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

4

4 回答 4

23

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

"stderr"将错误发送到stderr而不是stdout。该值从 PHP 5.2.4 开始可用。

或者,如果您使用的是命令行界面并且想要自己输出错误,则可以重新使用命令行输入/输出流

fwrite(STDERR, 'error message');

STDERR是一个已经打开的流到stderr

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

$fe = fopen('php://stderr', 'w');
fwrite($fe, 'error message');
于 2011-06-22T23:08:44.563 回答
9

如果您希望 php 解释器发送的错误消息应该转到stderr-pipe,您必须设置display_errorsstderr

于 2011-06-22T23:06:43.903 回答
2

这是从 PHP 领域返回到 shell 环境所必需的,以便正确解析错误消息。您仍然需要 exit(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
于 2016-06-16T08:51:51.197 回答
1

您还可以使用带有“php://stderr”的file_put_contents()来输出到标准错误,例如:

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

在 Bash shell 中执行时,它将“Hiya,PHP!\n”输出到标准错误,而没有输出到标准输出。

于 2013-05-24T16:44:43.087 回答