分析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 21 PHP
强烈声明: 不要使用(include/require)_once
Jun 06 PHP
PHP字符串长度计算 - strlen()函数使用介绍
Oct 15 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
Aug 23 PHP
php生成shtml类用法实例
Dec 09 PHP
php通过文件流方式复制文件的方法
Mar 13 PHP
PHP实现的增强性mhash函数
May 27 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
Dec 19 PHP
让你的PHP7更快之Hugepage用法分析
May 31 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
Dec 05 PHP
php连接sftp的作用以及实例代码
Sep 23 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
Dec 04 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生成WAP页面
2006/10/09 PHP
最新用php获取谷歌PR值算法,附上php查询PR值代码示例
2011/12/25 PHP
php自定义的格式化时间示例代码
2013/12/05 PHP
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
深入理解JavaScript 闭包究竟是什么
2013/04/12 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
js字符串转成JSON
2013/11/07 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
javascript随机显示背景图片的方法
2015/06/18 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
python如何实现内容写在图片上
2018/03/23 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
Python实现注册、登录小程序功能
2018/09/21 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
如何在 Django 模板中输出 "{{"
2020/01/24 Python
Django celery异步任务实现代码示例
2020/11/26 Python
医药专业推荐信
2013/11/15 职场文书
学校交通安全责任书
2014/08/25 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
一般党员对照检查材料
2014/09/24 职场文书
校长四风对照检查材料
2014/09/27 职场文书
文明班级申报材料
2014/12/24 职场文书
放飞理想主题班会
2015/08/14 职场文书
导游词幽默开场白
2019/06/26 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书
Python离线安装openpyxl模块的步骤
2021/03/30 Python
springboot+zookeeper实现分布式锁
2022/03/21 Java/Android