分析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 09 PHP
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
判断是否为指定长度内字符串的php函数
Feb 16 PHP
PHP中的string类型使用说明
Jul 27 PHP
php小偷相关截取函数备忘
Nov 28 PHP
php实现微信发红包
Dec 05 PHP
Thinkphp连表查询及数据导出方法示例
Oct 15 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
Oct 22 PHP
PHP实现的数独求解问题示例
Apr 18 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
Sep 29 PHP
解决Laravel blade模板转义html标签的问题
Sep 03 PHP
php的instanceof和判断闭包Closure操作示例
Jan 26 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数据流应用的一个简单实例
2012/09/14 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
PHP 数组基本操作小结(推荐)
2016/06/13 PHP
node.js中的url.format方法使用说明
2014/12/10 Javascript
jQuery动画效果图片轮播特效
2016/01/12 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
JS集合set类的实现与使用方法示例
2019/02/01 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
详解python3中socket套接字的编码问题解决
2017/07/01 Python
Python数据集切分实例
2018/12/08 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
Python学习笔记之Zip和Enumerate用法实例分析
2019/08/14 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
python实现布隆过滤器及原理解析
2019/12/08 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
Python修改DBF文件指定列
2020/12/19 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
财务会计专业求职信范文
2013/12/31 职场文书
申请任职学生会干部自荐书范文
2014/02/13 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
项目经理任命书
2014/06/04 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
出租车拒载检讨书
2015/01/28 职场文书
三方合作意向书范本
2015/05/09 职场文书
安全教育片观后感
2015/06/17 职场文书
高二数学教学反思
2016/02/18 职场文书
微信小程序基础教程之echart的使用
2021/06/01 Javascript