分析php://output和php://stdout的區別
阿新 • • 發佈:2018-12-17
PHP包含了以php://開頭的一系列輸出輸出流,如php://stdin, php://stdout等。今天檢視程式碼時,忽然想到一個問題:php://output和php://stdout有什麼區別?
兩者區別如下:
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_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呼叫的資訊都作為執行結果發往結果輸出流,所以都正常顯示。