发布于2026-05-23 阅读(0)
扫一扫,手机访问
今天,我们来深入聊聊 PHP 中两个容易混淆的流包装器:php://output 和 php://stdout。它们看似都与输出有关,但在不同的运行环境下,行为却大相径庭。下面通过实战案例,一起来剖析一下。

要理清区别,首先得回归源头。查阅 PHP 官方手册,关于输入流 php://stdin 和 php://input 的解释比较明确(但输出流的说明相对简略):
php://stdin
手册指出,php://stdin、php://stdout 和 php://stderr 允许直接访问 PHP 进程对应的输入或输出流。这个流引用的是一个重复的文件描述符。这意味着,如果你打开 php://stdin 随后又关闭它,关闭的只是你自己那份描述符的副本——由 STDIN 常量引用的实际流并不会受到影响。值得注意的是,在 PHP 5.2.1 之前,这方面存在一些程序错误行为。因此,通常建议直接使用 STDIN、STDOUT 和 STDERR 这些常量,而不是手动用这些包装器打开流。
其中,php://stdin 是只读的,而 php://stdout 和 php://stderr 是只写的。
php://input
php://input 是一个只读流,用于读取请求体(request body)中的原始数据。对于 POST 请求,使用 php://input 通常比 $HTTP_RAW_POST_DATA 更可取,因为它不依赖于特定的 php.ini 指令。此外,在那些默认不填充 $HTTP_RAW_POST_DATA 的情况下,它是比激活 always_populate_raw_post_data 更节省内存的替代方案。不过,当表单的 enctype="multipart/form-data" 时,php://input 不可用。
文档并没有直接对比 php://output 和 php://stdout 的区别。但如果我们仔细推敲,可以从相关描述中提炼出关键信息:首先,它们都是只写流;其次,php://stdout 是 PHP 进程自身的标准输出流,而 php://input 的对比对象暗示了 php://output 应与“请求-响应”周期相关。
那么,两者的本质区别究竟何在?
顺着 php://stdin 是“进程输入流”这个线索,联想一下 PHP 进程的执行过程,再结合不同的服务器 API(SAPI)实现,答案就清晰了:php://stdout 是 PHP 进程本身的输出流,只要进程在运行,就可能向它写入数据(例如 CLI 模式下的交互式输出);而 php://output,则可以理解为 PHP 脚本执行产生的“结果数据流”,专门用于向当前请求的客户端输出内容。同理,php://stdin 和 php://input 的区别也在于此:一个是进程的通用输入,一个是特定于本次请求的输入。
理论需要实践来检验。看下面这段代码:
// file: test.php
file_put_contents("php://output", "message sent by output" . PHP_EOL);
file_put_contents("php://stdout", "message sent by stdout" . PHP_EOL);
print("message sent by print" . PHP_EOL);
echo "SAPI:", PHP_SAPI , PHP_EOL;
在命令行下执行,输出如下:
message sent by output
message sent by stdout
message sent by print
SAPI:cli
通过浏览器请求(例如使用 FPM),输出则变为:
message sent by output
message sent by print
SAPI:fpm-fcgi
看到了吗?结果截然不同。在 CLI 模式下,PHP 进程的标准输出流(stdout)和结果输出流(output)都指向终端,所以所有信息都能打印出来。但在 Web 环境(如 FPM)下,PHP 进程的标准输出流通常被忽略或重定向,只有通过 php://output 这个“结果数据流”发送的内容,才会被 Web 服务器捕获并返回给浏览器。这也解释了为什么 print 和 echo 的内容总能正常显示——因为它们默认就是输出到“结果数据流”的。
希望这个案例能帮助你彻底掌握两者的区别。理解这些底层细节,对于编写能在不同 SAPI 下正确运行的代码,或者进行高级调试,都大有裨益。
推荐阅读:
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8