12factor-PHPアプリケーションがバッファなしでイベントストリームをstdoutに書き込む場合、実際の出力はどこに送られますか?
私はPHPのバックグラウンドから話していますが、これは他のWebサーバー言語にも当てはまると思います。 stdout
は、名前のとおり、すべての標準出力が表示される場所ではありませんか?また、それはHTTP応答が行くところではありませんか?何か足りないのですか?
答え :
解決策:
従来、CGIアプリケーションはSTDOUTを使用してHTTP応答を送信していました。 CGIアプリケーションは、Webサーバーによって呼び出される実行可能ファイルにすぎません。 CGIアプリケーションは、STDINを使用して要求を読み取り、STDOUTを使用して応答を発行します。 CGIアプリケーションの優れている点は、ネットワークを理解する必要がないことです。それらはUNIXモデルに見事に適合します。
PHPはCGIアプリケーションとして開始されました。 CGIアプリケーションはもはやあまり人気がありません(それらはうまく拡張できません)が、PHPはまだこの基本モデルに従います。したがって、PHPはWebサーバーではないため、PHPでイベントをSTDOUTにログに記録することはできません。 PHPのSTDOUTは確かにHTTP応答です。
PHPアプリケーション全体が起動し、ブートストラップして、すべての単一のHTTPリクエストのコンテキスト内で終了します。
独自のTCPデーモンを起動し、独自のHTTPサーバーを持つWebアプリケーションがこれを実行できます。 STDOUTがあり、すべてのクライアントがHTTP応答を書き込むためのTCP接続があります。 Go、Node.js、Javaなどの例がありますが、これはCGIモデルに準拠していない他の言語にも当てはまります。
したがって、これはPHPにとって意味のあることではありません。 PHPを使用してTCPサーバーソケットを開き、PHPでHTTPプロトコルを実装する場合は、意味があります。これを行う人もいますが(reactphp、amphpを参照)、本当に正当な理由がない限り、おそらくこれを行うべきではありません。ロギングにSTDOUTを使用できることは、これらの理由の1つではありません。 syslogは問題ありません。
答え :
解決策:
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が実行されているコンテキストに応じて、その出力はさまざまな場所に送信されます。 Webサーバーを介して提供される場合、 echo
およびPHPタグ以外のものはすべてHTTP応答に送られます(少なくともApache2 / PHP5では)。このHTTP応答は、 stdout
とは異なります。 CLI経由で実行した場合、 echo
はstdout
に移動します。
この質問も関連している可能性があります:Apache上のPHPstdout
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。