我说的是来自PHP背景,但我认为这适用于其他Web服务器语言。是不是stdout
这里所有的标准输出都是这样命名的?另外,这不是HTTP响应的地方吗?我错过了什么吗?如果一个PHP应用程序将其缓冲区事件流写入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
传统上,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进行日志记录并不是其中的原因之一。系统日志很好。
- 1. STDOUT缓冲区在哪里?
- 2. 将文件加载/流式传输到缓冲区/缓冲区
- 3. 输出一个缓冲流
- 4. 如何用缓冲区删除输入流的缓冲区?
- 5. 将流写入缓冲区对象
- 6. 从输出缓冲区PHP URL重写
- 7. 将stdout C文件流重定向到缓冲区
- 8. 如何关闭输入/输出缓冲区中的输入/输出缓冲区
- 9. 音频输入流到缓冲区
- 10. 写入PHP输出缓冲区,然后从缓冲区下载CSV
- 11. 输出缓冲区+ PDF - PHP
- 12. Linux/Perl:除STDOUT和STDERR之外的其他输出缓冲区?
- 13. 读取缓冲区并将其重写到http.Response中去
- 14. 将子stdout捕获到缓冲区
- 15. PHP输出缓冲区控件
- 16. 用C++写一个缓冲区到PDF
- 17. 如何将缓冲区写入缓冲区
- 18. Naudio缓冲区和实时流传输
- 19. 缓冲输出流
- 20. PHP Scoped输出缓冲区,如何?
- 21. 如何确定一个malloc'ed缓冲区的实际用法
- 22. Java输入流缓冲区对象?
- 23. 将大字节流缓冲区发送到另一个进程
- 24. 输出缓冲区
- 25. 将输入流读取到缓冲区的最佳方法
- 26. 实际保存或写入的应用程序属性设置在哪里?
- 27. 使用PHP输出缓冲区压缩缓存的输出
- 28. 如何将let程序写入哪里?
- 29. 用PHP输出缓冲区捕获PNG流
- 30. 串口输入输出缓冲区
运行命令行应用程序,它是一个Web服务器...你会看到命令行(*标准输出*)上的一些调试输出,但接收的网络连接它的操控性是完全独立的事情。 – deceze