分析php://output和php://stdout的区别


Posted in PHP onMay 06, 2018

PHP包含了以php://开头的一系列输出输出流,如php://stdin, php://stdout等。今天查看代码时,忽然想到一个问题:php://output和php://stdout有什么区别?

从PHP的官方文献中找答案,对输入流php://stdin和php://input的解释分别如下(输出流的解释过于简略):

php://stdin

php://stdin, php://stdout and php://stderr allow direct access to the corresponding input or output stream of the PHP process. The stream references a duplicate file descriptor, so if you open php://stdin and later close it, you close only your copy of the descriptor-the actual stream referenced by STDIN is unaffected. Note that PHP exhibited buggy behavior in this regard until PHP 5.2.1. It is recommended that you simply use the constants STDIN, STDOUT and STDERR instead of manually opening streams using these wrappers.

php://stdin is read-only, whereas php://stdout and php://stderr are write-only.

php://input

php://input is a read-only stream that allows you to read raw data from the request body. In the case of POST requests, it is preferable to use php://input instead of $HTTP_RAW_POST_DATA as it does not depend on special php.ini directives. Moreover, for those cases where $HTTP_RAW_POST_DATA is not populated by default, it is a potentially less memory intensive alternative to activating always_populate_raw_post_data. php://input is not available with enctype=”multipart/form-data”.

文档并未直接阐述两者的区别,仔细对比可得出以下信息:1. 均是只读流; 2. php://stdin是PHP进程的标准输入,php://input用来读取请求正文的原始数据。通过这些信息,该如何正确认识两者的本质区别?

顺着php://stdin进程输入的提示,联想PHP进程的执行过程,再结合SAPI的差异,可以得到两者主要区别:php://stdin是PHP进程的输入流,执行生命周期内均可能有数据流入(例如CLI下的交互式输入);php://input是PHP执行时的外部输入流,一般数据只能读一次(具体看SAPI的实现)。同理可得到php://stdout和php://output的区别:php://stdout是PHP进程的标准输出流,php://output是返回的结果数据流。

下面用代码验证结论:

// 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

浏览器端请求,输出如下:

message sent by output
message sent by print
SAPI:fpm-fcgi

在命令行下,PHP进程的标准输出流和结果输出流均指向终端,所有消息都打印出来。在浏览器端,PHP进程的输出流被忽略,只有结果数据流被发送到web服务器。同时,print和echo调用的信息都作为执行结果发往结果输出流,所以都正常显示。

最后再感慨一下PHP内置函数的简洁实用,一个file_put_contents函数就搞定流写入操作,换Java需要stream/writer一堆代码,也省去C风格的fopen/fwrite/fclose的繁琐。

PHP 相关文章推荐
PHP 身份验证方面的函数
Oct 11 PHP
PHP 压缩文件夹的类代码
Nov 05 PHP
PHP递归调用的小技巧讲解
Feb 19 PHP
php猴子选大王问题解决方法
May 12 PHP
在PHP中使用FastCGI解析漏洞及修复方案
Nov 10 PHP
php字符串的替换,分割和连接方法
May 23 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
Laravel中为什么不使用blpop取队列详析
Aug 01 PHP
PDO::beginTransaction讲解
Jan 27 PHP
php防止表单重复提交实例讲解
Feb 11 PHP
PHP大文件及断点续传下载实现代码
Aug 18 PHP
基于PHP实现生成随机水印图片
Dec 09 PHP
PHP 布尔值的自增与自减的实现方法
May 03 #PHP
PHPExcel 修改已存在Excel的方法
May 03 #PHP
PHP中PDO事务处理操作示例
May 02 #PHP
PHP简单实现解析xml为数组的方法
May 02 #PHP
PHP实现动态压缩js与css文件的方法
May 02 #PHP
Yii2框架数据验证操作实例详解
May 02 #PHP
Yii2框架类自动加载机制实例分析
May 02 #PHP
You might like
Yii使用smsto短信接口的函数demo示例
2016/07/13 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
DHTML 中的绝对定位
2006/11/26 Javascript
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
使用console进行性能测试
2015/04/27 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
Bootstrap-table使用footerFormatter做统计列功能
2018/09/07 Javascript
NodeJS有难度的面试题(能答对几个)
2019/10/09 NodeJs
如何在JavaScript中正确处理变量
2020/12/25 Javascript
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
python常用知识梳理(必看篇)
2017/03/23 Python
Python3 Random模块代码详解
2017/12/04 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
美国和加拿大计算机和电子产品购物网站:TigerDirect.com
2019/09/13 全球购物
毕业生的求职信范文分享
2013/12/04 职场文书
绩效工资分配方案
2014/01/18 职场文书
财务总监岗位职责
2014/03/07 职场文书
电子商务专业求职信
2014/03/08 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书