• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
精力束台经 显示全部楼层 发表于 2021-10-25 19:52:11 |阅读模式 打印 上一主题 下一主题
PHP包罗了以php://开头的一系列输出输出流,如php://stdin, php://stdout等。本日查看代码时,忽然想到一个题目:php://output和php://stdout有什么区别?
从PHP的官方文献中找答案,对输入流php://stdin和php://input的表明分别如下(输出流的表明过于大抵):
  1. php://stdin
  2. 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.
  3. php://stdin is read-only, whereas php://stdout and php://stderr are write-only.
  4. php://input
  5. 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是返回的结果数据流。
下面用代码验证结论:
  1. // file: test.php
  2. file_put_contents("php://output", "message sent by output" . PHP_EOL);
  3. file_put_contents("php://stdout", "message sent by stdout" . PHP_EOL);
  4. print("message sent by print" . PHP_EOL);
  5. echo "SAPI:" , PHP_SAPI , PHP_EOL;
复制代码
命令行实行文件,输出如下:
  1. message sent by output
  2. message sent by stdout
  3. message sent by print
  4. SAPI:cli
复制代码
欣赏器端请求,输出如下:
  1. message sent by output
  2. message sent by print
  3. SAPI:fpm-fcgi
复制代码
在命令行下,PHP进程的尺度输出流和结果输出流均指向终端,全部消息都打印出来。在欣赏器端,PHP进程的输出流被忽略,只有结果数据流被发送到web服务器。同时,print和echo调用的信息都作为实行结果发往结果输出流,以是都正常表现。
最后再感慨一下PHP内置函数的简洁实用,一个file_put_contents函数就搞定流写入操纵,换Java需要stream/writer一堆代码,也省去C风格的fopen/fwrite/fclose的繁琐。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作