分析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 Hash函数,增强密码安全
Feb 25 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
Mar 05 PHP
PHP 第二节 数据类型之数组
Apr 28 PHP
浅析PHP程序设计中的MVC编程思想
Jul 28 PHP
php通过ksort()函数给关联数组按照键排序的方法
Mar 18 PHP
php实现简易聊天室应用代码
Sep 23 PHP
crontab无法执行php的解决方法
Jan 25 PHP
php抽奖概率算法(刮刮卡,大转盘)
Apr 17 PHP
全面解析PHP操作Memcache基本函数
Jul 14 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
Oct 17 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
Jan 16 PHP
thinkphp3.2框架中where条件查询用法总结
Aug 13 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
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
php设计模式之委托模式
2016/02/13 PHP
对象特征检测法判断浏览器对javascript对象的支持
2009/07/25 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
Bootstrap表格和栅格分页实例详解
2016/05/20 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
jQuery Plupload上传插件的使用
2017/04/19 jQuery
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
Python实现保证只能运行一个脚本实例
2015/06/24 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
widows下安装pycurl并利用pycurl请求https地址的方法
2018/10/15 Python
python如何制作英文字典
2019/06/25 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
2019/07/06 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
一款CSS3实现多功能下拉菜单(带分享按)的教程
2014/11/05 HTML / CSS
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
交通事故检查书范文
2014/01/30 职场文书
大学生优秀自荐信范文
2014/02/25 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
对照检查剖析材料
2014/09/30 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
python-for x in range的用法(注意要点、细节)
2021/05/10 Python