2017-08-24 46 views
1

我说的是来自PHP背景,但我认为这适用于其他Web服务器语言。是不是stdout这里所有的标准输出都是这样命名的?另外,这不是HTTP响应的地方吗?我错过了什么吗?如果一个PHP应用程序将其缓冲区事件流写入stdout,实际输出到哪里去?

+1

运行命令行应用程序,它是一个Web服务器...你会看到命令行(*标准输出*)上的一些调试输出,但接收的网络连接它的操控性是完全独立的事情。 – deceze

回答

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运行上下文,其产出被导向不同的地方。如果通过网络服务器echo提供服务,并且PHP标记之外的任何内容都会转到HTTP响应(至少在Apache2/PHP5上)。此HTTP响应与stdout不同。如果通过CLI echo跑到stdout

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

5

传统上,CGI应用程序使用STDOUT发送HTTP响应。 CGI应用程序只是一些可执行文件,由Web服务器调用。 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进行日志记录并不是其中的原因之一。系统日志很好。