php 缓冲区操作函数
ob_start() // 开启大小无限制的缓冲区
ob_clean() / ob_flush() // 清空/冲出 当前缓冲区
ob_get_contents() // 获取 当前缓冲区的内容
ob_end_clean() / ob_end_flush() // 清空/冲出 并关闭 当前缓冲区
tcp 缓冲区操作函数
flush() // 将数据强制输出至客户端
当我们完成一次请求并从服务器取的数据显示在浏览器页面时,数据其实经过了两层数据 buffer
1、php 自己的数据 buffer(默认 1024 * 4 Bytes),操作函数以 ob_* 开头的系列函数
2、web服务器的数据 buffer:apache 是调用系统内核的 tcp buffer 模块(默认 1024 * 4 Bytes)
nginx 为自己的 fastcgi_buffer_size(参数配置)
当我们调用 echo 等输出数据时,数据并不会被立即返回给浏览器,php 会将其缓存到自身的 buffer 中,而后冲出至 tcp buffer 中,最后才是输出至浏览器。
另外要强调的一点是,php 对每次请求都会自动的开启一个 buffer,这个 buffer 的大小为 php 的配置项:output_buffering(如果我们手动调用的 ob_start 函数,则我们手动开启的 buffer size 是没有限制的)。 当 php 缓存的数据大于这个参数时,php 会把数据输出到 tcp buffer 中,tcp buffer 也会根据当前缓存区数据大小决定是否输出到浏览器。
program data >> php buffer >> tcp buffer >> client
手动调用缓冲区操作函数输出数据
//使用缓冲区操作函数手动输出
for ($i = 10; $i > 0; $i --) {
echo date("Y-m-d H:i:s") . nl2br(PHP_EOL);
ob_flush(); //将 php buffer 数据强制输出到 tcp buffer
flush(); // 将 tcp buffer 数据强制输出到浏览器
sleep(1);
}
根据缓冲区机制模拟填充满时的条件触发缓冲区输出数据
//根据缓冲区机制填充缓冲区 迫使其自动输出数据
for ($i = 10; $i > 0; $i --) {
echo date("Y-m-d H:i:s") . nl2br(PHP_EOL);
echo str_repeat(" ", 1024 * 8); // 我用的是 win 测试,可能 tcp buffer 会大一些 这里给他 8 字节的空格
sleep(1);
}
实时的将数据即时输出至浏览器
flush()
flush() 函数是将 tcp buffer 数据强制输出到客户端,而非等缓冲区满后自动输出。tcp buffer 的默认值是 4KB,也就是说在数据未缓冲满时是不会发送给客户端的,直至脚本执行结束。如果脚本仍在执行中,缓冲区已满,则会将数据输出到浏览器。我们可以通过 flush() 函数将 tcp buffer 的数据强制输出到浏览器。
ob_flush()
将当前 php 缓冲区的内容输出到 tcp buffer (假设当前缓冲区为一级缓冲区),而不等待缓冲区填满。所以调用顺序应为 ob_flush 到 tcp buffer,再 flush 到浏览器。
ob_start()
开启大小无限制的缓冲区(php 默认开启的缓冲区是受 output_buffering 限制的),所以如果你不手动的 ob_flush/ob_end_flush 的话php是不会把数据输出给 tcp buffer 的,这点要注意。