分析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初学者头痛的十四个问题
Jul 12 PHP
PHP 开发环境配置(Zend Studio)
Apr 28 PHP
应用开发中涉及到的css和php笔记分享
Aug 02 PHP
php预定义变量使用帮助(带实例)
Oct 30 PHP
php日历制作代码分享
Jan 20 PHP
PHP对象相互引用的内存溢出实例分析
Aug 28 PHP
64位windows系统下安装Memcache缓存
Dec 06 PHP
PHP读取PPT文件的方法
Dec 10 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
Aug 10 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
PHP中的Iterator迭代对象属性详解
Apr 12 PHP
PHP操作Redis常用命令的实例详解
Dec 23 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一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
ini_set的用法介绍
2014/01/07 PHP
ThinkPHP添加更新标签的方法
2014/12/05 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
php计算税后工资的方法
2015/07/28 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
小程序api实现promise封装过程解析
2019/11/21 Javascript
javascript浅层克隆、深度克隆对比及实例解析
2020/02/09 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
浅谈Python中的闭包
2015/07/08 Python
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
python自动化生成IOS的图标
2018/11/13 Python
Python常见数据类型转换操作示例
2019/05/08 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
pandas中ix的使用详细讲解
2020/03/09 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
python爬虫scrapy图书分类实例讲解
2020/11/23 Python
python 实现客户端与服务端的通信
2020/12/23 Python
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
美国存储和组织商店:The Container Store
2017/08/16 全球购物
超市开业庆典策划方案
2014/05/14 职场文书
药店采购员岗位职责
2014/09/30 职场文书
2014年话务员工作总结
2014/11/19 职场文书
2015年敬老月活动总结
2015/03/27 职场文书
婚宴父亲致辞
2015/07/27 职场文书
浅析Python中的套接字编程
2021/06/22 Python