菏泽市建设职工培训中心网站crm客户管理系统官网
news/
2025/9/24 8:15:45/
文章来源:
菏泽市建设职工培训中心网站,crm客户管理系统官网,专业建设网站公司,wordpress站长地图前言
默认情况下#xff0c;我们在PHP里使用echo等函数输出的内容#xff0c;是不会马上发送给前端的#xff0c;原因是有 buffer 的存在#xff0c;buffer又分两处#xff0c;一处是PHP本身的buffer#xff0c;另一处是Nginx的buffer。只有当buffer满了之后#xff0c…前言
默认情况下我们在PHP里使用echo等函数输出的内容是不会马上发送给前端的原因是有 buffer 的存在buffer又分两处一处是PHP本身的buffer另一处是Nginx的buffer。只有当buffer满了之后内容才会发送。
但有时候我们会希望输出的内容可以马上发送给前端例如类似ChatGPT之类的应用回答都是一个一个字的实时输出的给用户良好的体验。
那么怎么关闭 PHP 和 Nginx 的 buffer 呢
环境
Nginx 1.19 PHP 7.4
解决方法
一、PHP的buffer
PHP里有两个函数可以关闭buffer缓冲一个是ob_end_flush一个是ob_end_clean前者是输出缓冲区内容后关闭缓冲区后者是销毁缓冲区内容直接关闭。
但即使我们关闭了 PHP 的缓冲区每次输出完内容也还是要手动 flush 的例如
echo Hello World;
flush();每次echo完都要调用一次flush函数太麻烦了此时我们可以使用ob_implicit_flush函数来解决这个问题。
二、Nginx的buffer
Nginx有两种方法关闭缓冲区第一种是改Nginx的配置文件 加上图中红色框的配置指令就可以。 这种改配置文件的方法影响范围会比较大会导致所有的PHP请求都会关闭缓冲区不太推荐。 第二种方法是在 PHP 里输出 HTTP 响应头只要在响应头里加上一个X-Accel-Buffering: noNginx看到此响应头就会放弃使用buffer缓冲。由于这种方法是通过代码来控制所以影响范围我们可以自由操控推荐使用。
PHP代码示例
function stream()
{// 如果缓冲区没有开启直接调用ob_end_clean()会报错的要先判断缓冲区有没有开启// 如果ob_get_contents()不是返回false,说明有开启缓冲区(ob_start())$buf ob_get_contents();if ($buf ! false) {// 输出header前不能有任何输出内容否则会报错所以缓冲区里的内容要全部清空ob_end_clean();}ob_implicit_flush(); // 每次输出后都自动flush这样就不需要咱们手动flush了// 输出header让Nginx不要使用bufferheader(X-Accel-Buffering: no);// 每隔一秒输出一个数字for ($i 0; $i 10; $i) {echo $i\n;sleep(1);}
}stream();在 PowerShell 命令行中访问此页面可以看到数字会一个一个的实时显示出来 为什么要在命令行中访问 答因为有部分前端程序也是有自己的缓冲区的即使后端实时输出内容了前端也不会马上显示出来为了避免这种问题使用命令行来访问就很适合了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915305.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!