分析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 相关文章推荐
mysql5的sql文件导入到mysql4的方法
Oct 19 PHP
PHP 动态随机生成验证码类代码
Apr 09 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
May 18 PHP
php判断GIF图片是否为动画的方法
Sep 04 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
Sep 25 PHP
PHP常见数组函数用法小结
Mar 21 PHP
微信支付扫码支付php版
Jul 22 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
Nov 16 PHP
PHP数组相加操作及与array_merge的区别浅析
Nov 26 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 PHP
PHP实现打包zip并下载功能
Jun 12 PHP
PHP配置文件php.ini中打开错误报告的设置方法
Jan 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
php使用fopen创建utf8编码文件的方法
2014/10/31 PHP
PHP浮点数精度问题汇总
2015/05/13 PHP
php bootstrap实现简单登录
2016/03/08 PHP
php实现websocket实时消息推送
2018/03/30 PHP
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
javascript 处理null及null值示例
2014/06/09 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
2016/08/05 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
react实现pure render时bind(this)隐患需注意!
2017/03/09 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
vue+webpack 更换主题N种方案优劣分析
2019/10/28 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
春节晚会主持词
2014/03/24 职场文书
解除合同协议书
2014/04/17 职场文书
反腐倡廉警示教育活动总结
2014/05/05 职场文书
反邪教标语
2014/06/23 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
导游词书写之黄山
2019/08/06 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书
基于Python实现流星雨效果的绘制
2022/03/18 Python