关于php的buffer缓冲区

关于php的buffer(缓冲区)

传统的web php的输出数据,例如echo var_dump….等等输出函数(语句)是经过了几个步骤,最终到浏览器展示的呢?

以下是PHP的输出流程:

php echo,var_dump -> php output_buffering -> webServer buffer -> brower buff -> brower display

php 输出语句/函数->php 缓冲区配置->web服务器缓冲区配置->浏览器缓冲区->浏览器显示

本文主要讲解php的缓冲区:

php缓冲区配置主要由 php.ini 中的output_buffering配置的,在默认情况下,output_buffering=4096。

当php输出数据时,输出的数据将会先经过output_buffering中,直到数据大于output_buffering配置的值或者php文件执行完毕,则会将数据输出。

以下是一个代码示例:
res

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$i = 100;
ob_start(); // php-cli模式下,默认关闭buffer,主要测试缓冲区的作用
while ($i > 0) {
echo $i . "\n";
$i--;
sleep(1);
if ($i % 2 == 0) {
echo 'T' . time() . "\n";
ob_end_flush();
ob_start();
}
}
echo '完成';
die;

该代码主要说明了php缓冲区,先开启缓冲区,循环输出100的值,当值为偶数时,关闭并重新开启缓冲区,期间输出$i的值

输出结果为:
res

1
2
3
4
// 以下是第一次输出
100
99
T1575982331

res

同理,当在 web 访问时,php 默认开启4096的缓冲区,当里面存取的字符串长度超过时,将会进行一次输出到 web 服务器,可通过 ob_start() 和 ob_send_flush() 进行直接的缓冲区控制(此间将会无视output_buffering的值)。

注意:php-cli默认关闭缓冲区并且无视 output_buffering 的值,需要通过 ob_start() 函数进行打开,ini_set()无法修改output_buffering的配置。当 php.ini 中php buffer是关闭的,再次调用ob_end_flish() 会报warnging。

至于为什么web浏览器不能查看到分段输出的值,原因为:
web服务器还有一次缓冲区。

关于http分段输出:http://blog.csdn.net/xifeijian/article/details/42921827

经过几天的研究,关于浏览器分段输出的代码:(高版本下 Apache 默认开启buffer,可通过 httpd.conf 设置FcgidOutputBufferSize 0来保证不缓存)

1
2
3
4
5
6
7
8
9
10
<?php
for ($i = 0; $i < 1000; $i++) {
echo $i;

ob_flush(); // 刷新PHP自身缓冲区

flush(); // 刷新(特指apache)web服务器的缓冲区,输出数据

sleep(1);
}

nginx分段输出:

1
2
3
4
5
6
7
8
9
<?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);
}

输出结果为:
res

本文为转载文章,来自仙士可博客www.php20.cn

文章目录
  1. 1. 关于php的buffer(缓冲区)
本站总访问量 | 本页面被访问 | 您是第位小伙伴

© XueSi博客 版权所有 备案号 : 赣ICP备19008485号-1