如果 PHP 应用程序将其未缓冲的事件流写入 stdout,那么实际输出到哪里去了?

If a PHP application writes its event stream unbuffered to stdout, where does the actual output go?

我说的是 PHP 背景,但我认为这适用于其他网络服务器语言。 stdout 不是所有标准输出的地方吗?另外,那不是 HTTP 响应的去向吗?我错过了什么吗?

传统上,CGI 应用程序使用 STDOUT 发送 HTTP 响应。 CGI 应用程序只是一些可执行文件,由网络服务器调用。 CGI 应用程序使用 STDIN 读取请求,使用 STDOUT 发出响应。 CGI 应用程序的优点在于它们不需要了解网络。它们非常适合 UNIX 模型。

PHP 作为 CGI 应用程序启动。 CGI 应用程序不再流行(它们的扩展性不好),但是 PHP 仍然遵循这个基本模型。因此,您实际上无法将事件记录到 PHP 中的 STDOUT,因为 PHP 不是网络服务器。 PHP 中的 STDOUT 是 确实是 HTTP 响应。

您的整个 PHP 应用程序在每个 HTTP 请求的上下文中启动、引导和终止。

启动自己的 TCP 守护程序并拥有自己的 HTTP 服务器的 Web 应用程序可以执行此操作。它将有一个 STDOUT,并且它将有一个 TCP 连接供每个客户端写入 HTTP 响应。一些示例是 Go、Node.js、Java,但这适用于不遵循 CGI 模型的任何其他语言。

所以这对 PHP 来说并不是真正有意义的事情。如果您使用PHP打开一个TCP服务器套接字并在PHP中实现HTTP协议,那么可以有意义。有些人这样做(请参阅 reactphp、amphp),但除非您有充分的理由,否则您可能不应该这样做。能够使用 STDOUT 进行日志记录不是这些原因之一。系统日志很好。

看完 Evert 的回答后,我想我已经澄清了一些长期以来的假设,所以我做了一个实验。

<?php
echo "Echo output\n";
fwrite(STDOUT, "stdout output\n");
?>
Post-closing tag output

运行 这在命令行上显示为:

Echo output
stdout output
Post-closing tag output

但是通过浏览器查看此文件显示:

Echo output
Post-closing tag output

意思是,根据PHP是运行的上下文,它的输出指向不同的地方。如果通过网络服务器提供服务,echo 和 PHP 标签之外的任何内容都会转到 HTTP 响应(至少在 Apache2/PHP5 上)。此 HTTP 响应不同于 stdout。如果 运行 通过 CLI echo 转到 stdout

这个问题也可能是相关的:PHP stdout on Apache