我正在通过 MacOS 中的 NSTask 运行 PHP CLI,但这个问题更多的是关于 CLI 本身。
我正在听stderr
管道,但无论我尝试运行什么文件,那里都没有输出:
- 如果文件类型不是纯文本,则
stdout
设置为?
. - 如果文件是一个有错误的 php 脚本,错误消息仍然会打印到
stdout
.
是否有切换到解释器来处理错误stderr
?除了解析之外,我是否可以选择检测错误stdout
?
该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');
如果您希望 php 解释器发送的错误消息应该转到stderr
-pipe,您必须设置display_errors
为stderr
这是从 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
您还可以使用带有“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”输出到标准错误,而没有输出到标准输出。