PHP CLI 不使用 stderr 输出错误

发布于 2024-11-16 21:13:45 字数 342 浏览 0 评论 0 原文

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

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

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

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

I'm running the PHP CLI through a NSTask in MacOS, but this question is more about the CLI itself.

I'm listening to the stderr pipe, but nothing is output there no matter what file I try to run:

  • If the file type is not a plain text, stdout sets to ?.
  • If the file is a php script with errors, the error messages are still printed to stdout.

Is there a switch to the interpreter to handle errors through stderr? Do I have an option to detect errors other than parsing stdout?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

(り薆情海 2024-11-23 21:13:45

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');

The display_errors directive (can be set everywhere) takes optionally the parameter "stderr" for it to report errors to stderr instead of stdout or completely disabled error output. Quoting from the PHP manual entry:

Value "stderr" sends the errors to stderr instead of stdout. The value is available as of PHP 5.2.4.

Alternatively if you're using the commandline interface and you want to output the errors your own you can re-use the command-line nput/output streams:

fwrite(STDERR, 'error message');

Here STDERR is an already opened stream to stderr.

Alternatively if you want to do it just for this script and not in CLI you can open a filed handler to php://stderr and write the error messages there.

$fe = fopen('php://stderr', 'w');
fwrite($fe, 'error message');
梦中楼上月下 2024-11-23 21:13:45

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

If you want the error messages sent by the php interpreter should go to the stderr-pipe, you must set display_errors to stderr

知你几分 2024-11-23 21:13:45

这是从 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

This is required to return from PHP realm into shell environment in order to parse properly error message. You still need to exit(1) or whatever integer in order to return exit status code from PHP to shell.

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

Then, your crontab entry will look like:

30 3 * * * /usr/bin/php /full/path/to/phpFile.php >> /logdir/fullpath/journal.log 2>> /logdir/fullpath/error_journal.log
乜一 2024-11-23 21:13:45

您还可以将 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 中执行时,不会产生任何标准输出。

You can also use file_put_contents() with "php://stderr" to output to standard error, like:

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

which outputs "Hiya, PHP!\n" to standard error and nothing to standard output when executed in a Bash shell.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文