1

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

4

2 回答 2

5

传统上,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 进行日志记录不是这些原因之一。系统日志很好。

于 2017-08-24T15:17:50.463 回答
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 运行的上下文,它的输出被定向到不同的地方。如果通过网络服务器提供服务,echoPHP 标记之外的任何内容都会转到 HTTP 响应(至少在 Apache2/PHP5 上)。此 HTTP 响应不同于stdout. 如果通过 CLI 运行,echo则转到stdout.

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

于 2017-08-24T16:01:26.387 回答