分析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&MYSQL分页原理及实现
Jan 02 PHP
20个PHP常用类库小结
Sep 11 PHP
解析ajax事件的调用顺序
Jun 17 PHP
php中的比较运算符详解
Oct 28 PHP
php获取网页请求状态程序示例
Jun 17 PHP
ThinkPHP的MVC开发机制实例解析
Aug 23 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
Apr 01 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
Jan 07 PHP
PHP实现阿里大鱼短信验证的实例代码
Jul 10 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
PHP实现的mysql读写分离操作示例
May 22 PHP
PHP的PDO预定义常量讲解
Jan 24 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
我的论坛源代码(六)
2006/10/09 PHP
PHP 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
PHP中使用BigMap实例
2015/03/30 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
jQuery提交多个表单的小例子
2013/06/30 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
2013/07/30 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
Bootstrap创建可折叠的组件
2016/02/23 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
react-router4 嵌套路由的使用方法
2017/07/24 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
Vue.js watch监视属性知识点总结
2019/11/11 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
用Python实现读写锁的示例代码
2018/11/05 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
基于Python fminunc 的替代方法
2020/02/29 Python
推荐技术人员一款Python开源库(造数据神器)
2020/07/08 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
解释一下抽象方法和抽象类
2016/08/27 面试题
2019年Java面试必问之经典试题
2012/09/12 面试题
大学本科生的个人自我评价
2013/12/09 职场文书
奶茶专卖店创业计划书
2014/01/18 职场文书
5.12护士节演讲稿
2014/04/30 职场文书
毕业生实习期转正自我鉴定
2014/09/26 职场文书
家庭困难证明
2014/10/12 职场文书
2015年七一建党节活动总结
2015/03/20 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android