php实时输出接口返回实时数据_php实时输出api设计【步骤】
发布时间 - 2026-01-29 00:00:00 点击率:次PHP实时输出需逐层关闭缓冲:禁用Nginx gzip/fastcgi_buffering、Apache mod_deflate、PHP output_buffering/zlib压缩,首行输出1024空格绕过Chrome缓冲,配合ob_flush()和flush(),并设置SSE响应头及心跳保活。
PHP 实时输出接口为什么用 flush() 没反应?
多数人卡在这一步:写了 echo、ob_flush()、flush(),但浏览器还是等全部执行完才显示。根本原因不是 PHP 代码错了,而是中间环节在“拦路”。
- Web 服务器(如 Nginx)默认开启
gzip或缓冲响应体,会攒够一定字节才发;需关闭:gzip off;(Nginx)或设置fastcgi_buffering off; - Apache 的
mod_deflate同样会压缩并缓存输出,需禁用或配置SetEnv no-gzip 1 - PHP 自身的输出缓冲链有好几层:
output_buffering(php.ini)、zlib.output_compression必须关掉,建议在脚本开头加:ini_set('output_buffering', 'Off'); ini_set('zlib.output_compression', false); - 浏览器也可能缓冲——特别是 Chrome 对小响应体有最小字节数要求(约 1KB),可在首行输出 1024 字符空格(
str_repeat(' ', 1024))绕过
用 while(true) 长轮询还是 EventSource?
别硬写长轮询。PHP 天然不适合维持大量并发长连接,while(true) + sleep() 在 Apache/PHP-FPM 下极易耗尽 worker 进程,且无法优雅中断。
-
EventSource(SSE)是更轻量的选择:前端用new EventSource('/stream.p,后端保持连接、按格式输出
hp')
data: ...\n\n,PHP 只需每轮echo "data: ".json_encode($msg)."\n\n"; ob_flush(); flush(); - 必须设置响应头:
header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); header('X-Accel-Buffering: no');(最后一项专治 Nginx 缓冲) - 若需双向实时(如聊天),SSE 不行,得换 WebSocket(用 Swoole 或 Workerman 实现),PHP 原生不支持服务端 WebSocket
ob_end_flush() 和 ob_flush() 到底该用哪个?
混淆点在于 PHP 输出缓冲层级。简单说:ob_flush() 清当前一级输出缓冲区,flush() 把 Web 服务器缓存里的内容真正推给客户端;ob_end_flush() 是清完还销毁缓冲区——一旦调了,后续 echo 就直通底层,不能再用 ob_*() 控制。
- 推荐固定组合:
ob_flush(); flush();(反复用) - 如果开头用了
ob_start(),结尾想彻底释放,才用ob_end_flush();但实时流中一般不需要销毁缓冲区 - 注意顺序:必须先
ob_flush()(把 PHP 用户缓冲刷到 SAPI 层),再flush()(把 SAPI 缓冲推给客户端),反了无效
如何避免超时和连接被意外断开?
PHP 默认 max_execution_time=30,Nginx 默认 proxy_read_timeout=60,这些都会杀死长连接。不调它们,实时流活不过一分钟。
- PHP 端:脚本开头加
set_time_limit(0);,并确保ignore_user_abort(true)(防止用户关页面导致脚本终止) - Nginx 端:在 location 块里配
proxy_read_timeout 3600;、proxy_buffering off;、chunked_transfer_encoding off; - 务必加心跳保活:每 15–30 秒输出一次注释行(
echo ": keep-alive\n\n"; ob_flush(); flush();),避免代理或防火墙因空闲断连
fastcgi_buffering 和浏览器的 1KB 缓冲门槛。
# php
# js
# 前端
# json
# apache
# nginx
# 防火墙
# 浏览器
# 字节
# websocket
# 后端
# proxy
# swoole
# chrome
# echo
# while
# 接口
# Event
# 并发
# location
# Workerman
# 的是
# 客户端
# 行输出
# 不需要
# 只需
# 而在
# 错了
# 用了
# 可在
# 写了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
bing浏览器学术搜索入口_bing学术文献检索地址
Laravel如何集成Inertia.js与Vue/React?(安装配置)
如何生成腾讯云建站专用兑换码?
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Python结构化数据采集_字段抽取解析【教程】
如何确认建站备案号应放置的具体位置?
如何在阿里云购买域名并搭建网站?
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
Laravel如何实现用户密码重置功能?(完整流程代码)
如何有效防御Web建站篡改攻击?
Laravel怎么在Controller之外的地方验证数据
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
制作公司内部网站有哪些,内网如何建网站?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
浅谈javascript alert和confirm的美化
网站制作报价单模板图片,小松挖机官方网站报价?
在线教育网站制作平台,山西立德教育官网?
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
Linux网络带宽限制_tc配置实践解析【教程】
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
如何在香港免费服务器上快速搭建网站?
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Laravel怎么在Blade中安全地输出原始HTML内容
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
如何在阿里云香港服务器快速搭建网站?
C++时间戳转换成日期时间的步骤和示例代码
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
网站建设要注意的标准 促进网站用户好感度!
做企业网站制作流程,企业网站制作基本流程有哪些?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
js代码实现下拉菜单【推荐】
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
如何挑选最适合建站的高性能VPS主机?
简历没回改:利用AI润色让你的文字更专业
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
Java垃圾回收器的方法和原理总结
Laravel如何使用.env文件管理环境变量?(最佳实践)
实例解析angularjs的filter过滤器
如何在 Pandas 中基于一列条件计算另一列的分组均值
PythonWeb开发入门教程_Flask快速构建Web应用


