一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - 分析php://output和php://stdout的區別

分析php://output和php://stdout的區別

2019-10-09 15:07laozhang PHP教程

本篇文章給大家詳細分析了php://output和php://stdout的用法區別以及實例代碼分享,有需要的朋友可以參考學習下。

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的繁瑣。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 韩国日本在线观看 | 97精品国产自在现线免费观看 | www.精品视频 | 欧美日韩精品乱国产538 | 接吻吃胸摸下面啪啪教程 | 蜜柚精彩在线观看 | 午夜福到在线4国产 | 国产精品日韩欧美一区二区 | 久久热国产在线视频 | 欧美香蕉| 亚洲六月丁香六月婷婷色伊人 | 日本一区二区三区精品 | 天天久久影视色香综合网 | 美女舒服好紧太爽了视频 | 亚洲第一男人天堂 | 美女下面揉出水免费视频 | 国产亚洲精aa在线观看不卡 | 青青青久热国产精品视频 | 97菊爱网 | 96萝莉 | 欧美特黄aaaaaa | 日产中文乱码卡一卡二 | 欧美 国产 日韩 第一页 | 日本一区二区三区精品 | 欧洲第一区第二区第三区 | 幻女free性摘花第一次 | 高清毛片一区二区三区 | 国产成人精品.一二区 | 无码人妻少妇色欲AV一区二区 | 黑人巨大初黑人解禁作品 | 男人的天堂在线观看免费 | 亚洲日本va中文字幕 | 成年男女免费大片在线观看 | 四虎影院永久网址 | 亚洲国产99999在线精品一区 | 范冰冰上面好大下面好紧 | 国产精品亚洲精品日韩已满 | 成人久久18免费网站入口 | 国产新疆成人a一片在线观看 | 男人在女人下面狂躁 | 国产精品永久免费自在线观看 |