简单记录PHP buffer ob_start ob_flush

发布时间:2019-08-08 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了简单记录PHP buffer ob_start ob_flush脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

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也会有自己的缓冲配置字段控制。

关于php缓冲
Nginx性能调优之buffer参数设置
nginx buffer php 失效问题

脚本宝典总结

以上是脚本宝典为你收集整理的简单记录PHP buffer ob_start ob_flush全部内容,希望文章能够帮你解决简单记录PHP buffer ob_start ob_flush所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。