分析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 相关文章推荐
初学者入门:细述PHP4的核心Zend
Sep 05 PHP
也谈 PHP 和 MYSQL
Oct 09 PHP
vBulletin HACK----关于排版的两个HACK
Oct 09 PHP
html中select语句读取mysql表中内容
Oct 09 PHP
在PHP中实现Javascript的escape()函数代码
Aug 08 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
在PHP上显示JFreechart画的统计图方法
Nov 03 PHP
php 中文字符串首字母的获取函数分享
Nov 04 PHP
深入浅出php socket编程
May 13 PHP
PHP实现的QQ空间g_tk加密算法
Jul 09 PHP
php查询内存信息操作示例
May 09 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 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学习之PHP变量
2006/10/09 PHP
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
linux下为php添加curl扩展的方法
2011/07/29 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
浅谈PHP安全防护之Web攻击
2017/01/03 PHP
JavaScript中的其他对象
2008/01/16 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
Python打印输出数组中全部元素
2018/03/13 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
python 最简单的实现适配器设计模式的示例
2020/06/30 Python
python如何代码集体右移
2020/07/20 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
Python进行特征提取的示例代码
2020/10/15 Python
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
机械专业技术员求职信
2014/06/14 职场文书
文明城市创建标语
2014/06/16 职场文书
学习考察心得体会
2014/09/04 职场文书
先进学校事迹材料
2014/12/30 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
法定授权委托证明书
2015/06/18 职场文书
nginx反向代理时如何保持长连接
2021/03/31 Servers
mysql部分操作
2021/04/05 MySQL
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS
MySQL中order by的执行过程
2022/06/05 MySQL