在 Nginx + PHP-FPM 架構下,呼叫 ob_flush() 和 flush() 仍無法即時輸出內容,瀏覽器需等待腳本結束才一次性顯示。phpinfo() 顯示 output_buffering 等設定正常,問題多半在 Nginx 層。
fastcgi_buffer_size 128k; fastcgi_buffers 8 128k;,PHP 輸出需累積 128 KB 才會傳給客戶端。location ~ \.php$ {
fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
# 其他 fastcgi_param 設定...
}
location /stream/ {
gzip off;
# 或僅針對特定 location 關閉
}
<?php
// 在 ob_flush()/flush() 前,先輸出 ≥ 4k 內容
echo str_repeat(' ', 1024 * 4); // 4 KB 空白
// 之後即可正常逐行輸出
for ($i = 1; $i <= 10; $i++) {
echo "Line $i
";
ob_flush();
flush();
sleep(1);
}
?>
server {
listen 80;
server_name example.com;
location /stream/ {
gzip off;
fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
include fastcgi_params;
}
}
瀏覽器開啟開發者工具 Network 標籤,觀察 Content-Length 是否為 chunked,以及回應是否隨時間逐段出現。
output_buffering = Off 不調 Nginx → 無效。「Nginx 緩衝區調小 + 關 gzip + PHP 先填充」三步缺一不可。調整後,PHP 的 ob_flush()/flush() 即可在長輪詢、SSE、即時日誌等場景正常運作。