php://output和php://stdout的区别

阅读量:22
2021-04-18

PHP包含了以/开头的一系列输出输出流,如/stdin, /stdout等。今天查看代码时,忽然想到一个问题:/output和/stdout有什么区别?

从PHP的官方文献中找答案,对输入流/stdin/input的解释分别如下(输出流的解释过于简略):

/stdin
/stdin, /stdout and /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 /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.
/stdin is read-only, whereas /stdout and /stderr are write-only.
/input
/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 /input instead of $ as it does not depend on special php.ini directives. Moreover, for those cases where $ is not populated by default, it is a potentially less memory intensive alternative to activating always_populate_raw_post_data. /input is not available with enctype="/form-data".

文档并未直接阐述两者的区别,仔细对比可得出以下信息:

1. 均是只读流;

2. /stdin是PHP进程的标准输入,/input用来读取请求正文的原始数据。

通过这些信息,该如何正确认识两者的本质区别?

顺着/stdin进程输入的提示,联想PHP进程的执行过程,再结合SAPI的差异,可以得到两者主要区别:

/stdin是PHP进程的输入流,执行生命周期内均可能有数据流入(例如CLI下的交互式输入);

/input是PHP执行时的外部输入流,一般数据只能读一次(具体看SAPI的实现)。

同理可得到/stdout和/output的区别:/stdout是PHP进程的标准输出流,/output是返回的结果数据流。

下面用代码验证结论:

// file: test.php
file_put_contents("/output", "message sent by output" . PHP_EOL);
file_put_contents("/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需要/writer一堆代码,也省去C风格的/fclose的繁琐。

推荐教程:PHP视频教程

以上就是/output和/stdout的区别的详细内容,更多请关注星网无限其它相关文章!

声明:本文转载于:segmentfault,如有侵犯,请联系admin@删除

THE END

发表评论

相关推荐

  • 有关fgets()函数的文章推荐10篇

    以下正文:这篇文章主要介绍了PHP文件读写操作相关函数总结,本文总结了fwrite()、fread()、fgets()、fgetc()、file()、readf ...

    阅读量:66
    2021-04-19
  • php递归与无限分类实例详解

    这篇文章主要介绍了php实现递归与无限分类的方法,涉及php的递归操作技巧,需要的朋友可以参考下本文实例讲述了php实现递归与 ...

    阅读量:45
    2021-04-19
  • CI框架中zip类的使用

    CI框架自带的zip类简单实用,本文就来简单说一下ci框架的zip类的使用,需要的朋友可以参考下CI框架自带的zip类简单实用,本文 ...

    阅读量:44
    2021-04-18
  • SWFUpload插件上传文件的代码

    这篇文章主要介绍了文件上传之SWFUpload插件(代码),实现此代码主要分为两部分:1.前台文件和 2.后台文件upload.php,需要 ...

    阅读量:42
    2021-04-18
  • 关于destoon的URL Rewrite设置方法

    这篇文章主要介绍了destoon的URL Rewrite(伪静态)设置方法,需要的朋友可以参考下1、如果您的服务器支持.htaccess,则无需设 ...

    阅读量:47
    2021-04-18