日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

与php有区别_php://output和php://stdout的区别

發布時間:2023/12/4 php 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 与php有区别_php://output和php://stdout的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

php中文網最新課程

每日17點準時技術干貨分享

PHP包含了以php://開頭的一系列輸出輸出流,如php://stdin, php://stdout等。

今天查看代碼時,忽然想到一個問題:php://output和php://stdout有什么區別?

從PHP的官方文獻中找答案,對輸入流php://stdin和php://input的解釋分別如下(輸出流的解釋過于簡略):

php://stdinphp://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://inputphp://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.phpfile_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 outputmessage sent by stdoutmessage sent by printSAPI:cli

瀏覽器端請求,輸出如下:

message?sent?by?outputmessage sent by printSAPI:fpm-fcgi

在命令行下,PHP進程的標準輸出流和結果輸出流均指向終端,所有消息都打印出來。在瀏覽器端,PHP進程的輸出流被忽略,只有結果數據流被發送到web服務器。

同時,print和echo調用的信息都作為執行結果發往結果輸出流,所以都正常顯示。

最后再感慨一下PHP內置函數的簡潔實用,一個file_put_contents函數就搞定流寫入操作,換Java需要stream/writer一堆代碼,也省去C風格的fopen/fwrite/fclose的繁瑣。

-END-

聲明:本文選自「?php中文網?」,搜索「 phpcnnew 」即可關注!

總結

以上是生活随笔為你收集整理的与php有区别_php://output和php://stdout的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。