我正在通过MacOS中的NSTask运行PHP CLI,但这个问题更多的是关于CLI本身。
我正在收听stderr
管道,但无论我尝试运行什么文件,都不会输出任何内容:
stdout
设置为?
。 stdout
。 是否可以通过stderr
切换到解释器来处理错误?我是否可以选择检测除解析stdout
之外的错误?
答案 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中执行时输出标准输出。