首頁 > 後端開發 > php教程 > php://output和php://stdout的差別

php://output和php://stdout的差別

藏色散人
發布: 2023-04-07 10:40:02
轉載
2436 人瀏覽過

PHP包含了以php://開頭的一系列輸出輸出流,如php://stdin, php://stdout等。今天查看程式碼時,突然想到一個問題:php://output和php://stdout有什麼差別?

從PHP的官方文獻中找答案,將輸入流php://stdinphp://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影片教學

#

以上是php://output和php://stdout的差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
php
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板