1. 程式人生 > >分析php://output和php://stdout的區別

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

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呼叫的資訊都作為執行結果發往結果輸出流,所以都正常顯示。