phpbuffer 路线
输出的字符串 => PHP buffer => 等待输出 => web 服务器的缓冲区 => tcp 缓冲区 => 客户端
phpbuffer 配置
output_buffering的默认值是打开状态,可以设置大于0的数值来打开buffer。如果设置为0就是关闭状态。
另外,php buffer的 cli与非cli模式不同,另外buffer的输出影响因素也会根据web容器(这里指apache和nginx)也不同。
以下例子在apahce +php模式下运行,nginx大概相同,只是buffer控制参数大小不同
例子1
<?php
$i='a';
echo $i;
sleep(5);
echo 3312;
这个没什么说的,脚本执行完毕后,合并输出到浏览器。
例子2
<?php
ob_start();
$i='a';
echo $i;
ob_flush();
sleep(5);
echo 3312;
这个会等5秒后再输出3312吗,答案是否定的,因为虽然开启了ob_start,也调用了flush相关函数,但是所有内容a3312还是一起输出到浏览器,因为flush之前,buffer的大小还没有被填充满,所以仍然不会输出。buffer默认为4096字节,也就是4KB
例子3
<?php
ob_start();
$i='a';
echo str_pad('a', 4096);
ob_flush();
flush();
sleep(5);
echo 3312;
这样结果会是先输出a,然后5秒后输出3312.
例子4
<?php
ob_start();
$i='a';
echo str_pad('a', 4096);
sleep(5);
echo 3312;
这样结果是一起输出,因为你即使手动开启了ob_start ,并且内容已经超过了缓冲区,但是你并没有显示调用flush函数,而且此时(echo 3312之前),脚本也并没有完成。
所以结论是即使超过默认值(4kb)也不会立即发送到浏览器,只到脚本运行完成,或者显示调用了ob_end_flush方法,才会输出到浏览器。
例子5
<?php
for ($i=0; $i <5 ; $i++) {
echo str_pad($i, '4096'),"<br>";
sleep(2);
}
这个结果是陆续输出,因为数据已经大于了一个buffer,憋不住了,就必须往外冒了。
php buffer 相关函数意义:
1.ob_start
打开output_buffering,脚本不再直接输出到浏览器,而是暂时写入php buffering区域。
不管此时数据写入多大,直到脚本运行完毕后,才发送。或者脚本结束之前,并且数据已经大于了buffer。可以参考例子四
2.ob_get_contents
获取php buffering中的数据,注意:要在ob_end_clean()前调用,否则只会得到空字符。
3.ob_flush ob_end_flush ob_clean
ob_flush不会销毁输出缓冲区,而像ob_end_flush() 函数会销毁缓冲区。
ob_end_flush只是把php buffer中的数据冲(flush/send)到客户端浏览器,而ob_clean将php bufeer中的数据清空(erase),但不发送给客户端浏览器。简单说就是ob_end_clean 不会输出,只会清空php buffering中的数据。
另外,flush()这个函数在例子中我发现没有什么卵用,可能环境不同。。还有我以上都是在apahce中测试,nginx也会有自己的缓冲配置字段控制。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。