我說的是來自PHP背景,但我認爲這適用於其他Web服務器語言。是不是stdout
這裏所有的標準輸出都是這樣命名的?另外,這不是HTTP響應的地方嗎?我錯過了什麼嗎?如果一個PHP應用程序將其緩衝區事件流寫入stdout,實際輸出到哪裏去?
回答
在閱讀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
傳統上,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進行日誌記錄並不是其中的原因之一。系統日誌很好。
- 1. STDOUT緩衝區在哪裏?
- 2. 輸出一個緩衝流
- 3. 如何用緩衝區刪除輸入流的緩衝區?
- 4. 將流寫入緩衝區對象
- 5. Linux/Perl:除STDOUT和STDERR之外的其他輸出緩衝區?
- 6. 讀取緩衝區並將其重寫到http.Response中去
- 7. 用C++寫一個緩衝區到PDF
- 8. 緩衝輸出流
- 9. PHP Scoped輸出緩衝區,如何?
- 10. 如何確定一個malloc'ed緩衝區的實際用法
- 11. Java輸入流緩衝區對象?
- 12. 輸出緩衝區
- 13. 使用PHP輸出緩衝區壓縮緩存的輸出
- 14. 實際保存或寫入的應用程序屬性設置在哪裏?
- 15. 輸出流緩衝輸出流附加
- 16. 使用緩衝寫入器在新文件中寫入輸出
- 17. 如何緩衝流事件?
- 18. 從緩衝的StdOut程序捕獲輸出
- 19. 如果json對象沒有返回,php輸出去哪裏
- 20. 爲什麼輸出IMediaSample的緩衝區大小小於其中一個輸入?
- 21. 將緩衝區內容複製到另一個緩衝區
- 22. PHP捲曲輸出緩衝區沒有收到迴應
- 23. PHP輸出緩衝到文本文件
- 24. 將緩衝區寫入設備時出現OpenCL訪問衝突
- 25. 用臨時緩衝區使用ofstream寫入臨時緩衝區
- 26. PHP輸出緩衝區不是空的?
- 27. 輸出緩衝區漏洞PHP
- 28. PHP輸出緩衝
- 29. 是否有可能構建一個wstring而不應用其輸入緩衝區?
- 30. 哪裏可以找到緩衝區溢出的演示?
運行命令行應用程序,它是一個Web服務器...你會看到命令行(*標準輸出*)上的一些調試輸出,但接收的網絡連接它的操控性是完全獨立的事情。 – deceze