echo は標準出力に書き込むという錯覚
PHP のサーバーサイドプログラミングをしているときに次のようなコードを書くと、出力がレスポンスボディに書き込まれて本来の内容と混ざってしまいます。
echo "hoge"; // レスポンスボディに "hoge" と書き込まれてしまう
この挙動をみて、Apache や PHP-FPM はスクリプトの標準出力の内容からレスポンスボディを生成しているんだと私は勝手に納得していたのですが、これは間違いだったという話です。
echo の出力先は出力バッファ
echo
は標準出力とは別の出力バッファ (php://output
)
と呼ばれるバッファに書き込みます。この出力バッファの内容がレスポンスボディになるということみたいです。
そのため echo
を使うとレスポンスボディと混ざる一方で php://stdout
や php://stderr
への出力は混ざらないということでした。
echo "hoge"; // 混ざる
// Laravel
Log::info("fuga"); // 混ざらない
$stdout = fopen('php://stdout', 'a');
fwrite($stdout, "piyo"); // 混ざらない
fclose($stdout);
$output = fopen('php://output', 'a');
fwrite($output, "saga"); // 混ざる
fclose($output);