flush函数php,PHP flush 和 ob_flush 的机制及详解

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);

}

1a438cda878dd1bb29b9cf47b74e2593.gif实时的将数据即时输出至浏览器

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 的,这点要注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值