PHP无法通过iframe直接实现实时输出,因浏览器和服务器会缓冲响应;需用SSE、WebSocket或轮询,且须关闭PHP输出缓冲、禁用Nginx fastcgi_buffering并正确调用ob_flush()与flush()。
PHP 实时输出内容到 是可行的,但不能直接“嵌入”一个正在执行的 PHP 脚本流—— 加载的是完整 HTTP 响应,不是实时流式管道。真正的实时输出需要配合前端轮询、Server-Sent Events(SSE)或 WebSocket,而 PHP 侧需控制响应头、缓冲和刷新时机。
echo + 看不到实时效果浏览器加载 时会等待目标 URL 的 HTTP 响应结束(即 PHP 脚本执行完、所有输出缓冲清空)才开始解析 HTML。即使你在 PHP 中反复调用 echo 和 flush(),大多数 Web 服务器(如 Nginx、Apache 默认配置)和浏览器都会缓冲响应,导致内容“攒够了才显示”。
output_buffering(通常为 4096 字节或 On),必须显式关闭ob_end_flush() 或 ob_flush() + flush() 缺一不可,且顺序不能颠倒fastcgi_buffering off,不关则 PHP 的 flush() 完全无效Server-Sent Events 是单向、轻量、原生支持流式文本推送的方案,比伪造 iframe 更可靠。PHP 后端只需保持连接打开、按规范输出 data: 行;前端用 EventSource 监听。
后端示例(sse.php):
前端只需:

适合简单场景(如日志尾部轮询),不推荐用于高频率或低延迟需求。
setInterval 定期 fetch('log.php') 并追加内容location.reload()
真正卡住的点往往不在 PHP 代码,而在 Nginx/Apache 配置、浏览器缓存策略、或对 flush() 作用域的误解。调试时先用 curl -N http://yoursite/sse.php 看原始响应是否逐行出来,再排查前端链路。