分析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中的类-什么叫类
Nov 20 PHP
php zend解密软件绿色版测试可用
Apr 14 PHP
php 仿Comsenz安装效果代码打包提供下载
May 09 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
Jun 13 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
Jun 25 PHP
C#使用PHP服务端的Web Service通信实例
Apr 08 PHP
windows下配置apache+php+mysql时出现问题的处理方法
Jun 20 PHP
php生成图片验证码的实例讲解
Aug 03 PHP
Composer设置忽略版本匹配的方法
Apr 27 PHP
PHP链表操作简单示例
Oct 15 PHP
微信小程序 消息推送php服务器验证实例详解
Mar 30 PHP
yii2.0框架场景的简单使用示例
Jan 25 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数组编码转换示例详解
2014/03/11 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
bootstrap是什么_动力节点Java学院整理
2017/07/14 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
Vue快速实现通用表单验证的示例代码
2020/01/09 Javascript
微信小程序canvas实现签名功能
2021/01/19 Javascript
python实现将元祖转换成数组的方法
2015/05/04 Python
python虚拟环境迁移方法
2019/01/03 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
css3旋转木马_动力节点Java学院整理
2017/07/12 HTML / CSS
英国电子产品购物网站:TobyDeals
2018/07/30 全球购物
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
为什么要使用servlet
2016/01/17 面试题
应聘美工求职信
2013/11/07 职场文书
物业管理计划书
2014/01/10 职场文书
写给女生的道歉信
2014/01/14 职场文书
海飞丝广告词
2014/03/20 职场文书
合伙经营协议书范本
2014/04/18 职场文书
学校文明单位申报材料
2014/05/06 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
师德师风个人自我剖析材料
2014/09/27 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
毕业实习证明范本
2015/06/16 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android