如果PHP应用程序将其缓冲的事件流写入stdout,实际输出在哪里?

时间:2017-08-24 15:10:30

标签: php 12factor

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

2 个答案:

答案 0 :(得分:5)

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

PHP起初是一个CGI应用程序。 CGI应用程序不再受欢迎(它们不能很好地扩展),但PHP仍然遵循这个基本模型。因此,您无法在PHP中将事件记录到STDOUT,因为PHP不是Web服务器。 PHP 中的STDOUT确实是 HTTP响应。

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

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

所以这并不是真正适合PHP的东西。如果您使用PHP打开TCP服务器套接字并在PHP中实现HTTP协议,可以有意义。有些人这样做(参见reactphp,amphp),但你可能不应该这样做,除非你有充分的理由。能够使用STDOUT进行日志记录不是其中一个原因。系统日志很好。

答案 1 :(得分:0)

在阅读了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的上下文,其输出将定向到不同的位置。如果通过Web服务器提供服务,echo以及PHP标记之外的任何内容都会转到HTTP响应(至少在Apache2 / PHP5上)。此HTTP响应与stdout不同。如果通过CLI echo运行,则转到stdout

这个问题也可能有用:PHP stdout on Apache