分析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 相关文章推荐
多数据表共用一个页的新闻发布
Oct 09 PHP
PHP多线程抓取网页实现代码
Jul 22 PHP
PHP中通过加号合并数组的一个简单方法分享
Jan 27 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
Jun 24 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
Jul 01 PHP
php格式化时间戳显示友好的时间实现思路及代码
Oct 23 PHP
php使用cookie显示用户上次访问网站日期的方法
Jan 26 PHP
android上传图片到PHP的过程详解
Aug 03 PHP
PHP中trait使用方法详细介绍
May 21 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP关于foreach复制知识点总结
Jan 28 PHP
浅谈php://filter的妙用
Mar 05 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
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
利用js实现遮罩以及弹出可移动登录窗口
2013/07/08 Javascript
JsRender for index循环索引用法详解
2014/10/31 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
2015/06/10 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
解决layui中的form表单与button的点击事件冲突问题
2018/08/15 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
vue移动端弹框组件的实例
2018/09/25 Javascript
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
2019/01/22 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
Ant Design的可编辑Tree的实现操作
2020/10/31 Javascript
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
python自动发邮件总结及实例说明【推荐】
2019/05/31 Python
Python input函数使用实例解析
2019/11/22 Python
python 实现二维列表转置
2019/12/02 Python
Python HTMLTestRunner可视化报告实现过程解析
2020/04/10 Python
vscode写python时的代码错误提醒和自动格式化的方法
2020/05/07 Python
python字典的值可以修改吗
2020/06/29 Python
Python实现像awk一样分割字符串
2020/09/15 Python
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
互联网创业计划书写作技巧攻略
2014/03/23 职场文书
工厂车间标语
2014/06/19 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
主题班会开场白
2015/06/01 职场文书
公司安全管理制度范本
2015/08/05 职场文书
opencv读取视频并保存图像的方法
2021/06/04 Python