2017-08-24 52 views
1

我說的是來自PHP背景,但我認爲這適用於其他Web服務器語言。是不是stdout這裏所有的標準輸出都是這樣命名的?另外,這不是HTTP響應的地方嗎?我錯過了什麼嗎?如果一個PHP應用程序將其緩衝區事件流寫入stdout,實際輸出到哪裏去?

+1

運行命令行應用程序,它是一個Web服務器...你會看到命令行(*標準輸出*)上的一些調試輸出,但接收的網絡連接它的操控性是完全獨立的事情。 – deceze

回答

0

在閱讀Evert的回答後,我想我已經澄清了一些長期持有的假設,所以我做了一個實驗。

<?php 
echo "Echo output\n"; 
fwrite(STDOUT, "stdout output\n"); 
?> 
Post-closing tag output 

在命令行中運行這說明這一點:

Echo output 
stdout output 
Post-closing tag output 

但觀看通過瀏覽器這個文件表明這一點:

Echo output 
Post-closing tag output 

含義,不同的地方PHP運行上下文,其產出被導向不同的地方。如果通過網絡服務器echo提供服務,並且PHP標記之外的任何內容都會轉到HTTP響應(至少在Apache2/PHP5上)。此HTTP響應與stdout不同。如果通過CLI echo跑到stdout

這個問題也可能是相關的:PHP stdout on Apache

5

傳統上,CGI應用程序使用STDOUT發送HTTP響應。 CGI應用程序只是一些可執行文件,由Web服務器調用。 CGI應用程序使用STDIN來讀取請求,並使用STDOUT來發出響應。 CGI應用程序的優點在於它們不需要了解網絡。它們在UNIX模型中非常出色。

PHP從CGI應用程序開始。 CGI應用程序不再流行(它們不能很好地擴展),但PHP仍然遵循這個基本模型。所以你不能真正能夠將事件記錄到PHP的STDOUT中,因爲PHP不是Web服務器。 PHP 中的STDOUT實際上是的HTTP響應。

您的整個PHP應用程序都會在每個HTTP請求的上下文中啓動,引導並終止。

啓動自己的TCP守護進程並擁有自己的HTTP服務器的Web應用程序可以執行此操作。它將有一個STDOUT,並且每個客戶端都會有一個TCP連接來寫HTTP響應。一些例子是Go,Node.js,Java,但這適用於任何其他不遵循CGI模型的語言。

所以這對於PHP來說並不合適。它可以如果您使用PHP打開TCP服務器套接字並在PHP中實現HTTP協議是有意義的。有些人這樣做(請參閱reactphp,amphp),但除非您有充分的理由,否則您可能不應該這樣做。能夠使用STDOUT進行日誌記錄並不是其中的原因之一。系統日誌很好。