企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
传统的 Web PHP 的 `echo` `var_dump` ....等等输出函数输出数据流程: php `echo`,`var_dump `-> php `output_buffering `-> webServer buffer-> browser buff -> browser display php 输出语句/函数 -> php 缓冲区配置 -> web 服务器缓冲区配置 -> 浏览器缓冲区 ->浏览器显示 PHP 缓冲区配置主要由 `php.ini` 中的 `output_buffering` 配置的,在默认情况下,`output_buffering = 4096`。 当 PHP 输出数据时,输出的数据将会先经过 `output_buffering` 中,直到数据大于`output_buffering` 配置的值或者 PHP 文件执行完毕,则会将数据输出 例子: ~~~ <?php // 开启buffer缓冲区 php-cli下默认关闭buffer,由于web访问测试较麻烦,该段代码只为了查看以及测试缓冲区的作用,在web模式下,默认开启,无需手动开启,可自行配置 ob_start(); for ($i = 0; $i < 50; $i++) { echo $i; sleep(1); if ($i % 10 == 0) { echo '输出一次', PHP_EOL; // 当i为10的倍数时,将直接结束并输出缓冲区的数据,然后再次开启缓冲区 ob_end_flush(); ob_start(); } } ~~~ ![](https://img.kancloud.cn/c8/61/c8610ad315e691bac2915db8ae0a688e_527x195.png) 同理,当在 web 访问时,php 默认开启 4096 的缓冲区,当里面存取的字符串长度超过时,将会进行一次输出到 web 服务器,可通过`ob_start()`和`ob_end_flush`进行直接的缓冲区控制(此间将会无视`output_buffering`的值) > PS: > php-cli 默认关闭缓冲区并且无视 `output_buffering`的值,需要通过`ob_start()` 函数进行打开 `ini_set`无法修改`output_buffering`的配置 当 php.ini 中 php buffer 是关闭的,再次调用`ob_end_flush()`会报 warning。 ### **为什么web浏览器不能查看到分段输出的值,原因为:web服务器还有一次缓冲区** Nginx 分段输出例子: ~~~php <?php set_time_limit(0); ob_end_clean(); ob_implicit_flush(); header('X-Accel-Buffering: no'); // 关键是加了这一行。 for ($i = 0; $i < 1000; $i++) { echo $i; sleep(1); } ~~~ ![](https://img.kancloud.cn/52/2b/522be8b84836c79e28dce478936eceb1_1920x834.png)