默认的PHP的echo、print之类的输出会被缓存,当缓存达到特定的大小或脚本执行结束,或强行刷新缓冲区才会发送到浏览器客户端。
php.ini
的outputing_buffer
字段默认是4096,表示缓存的大小,如果大于该值则会像浏览器客户端输出。但是我发现该值不管怎么改(ini_get('outputing_buffer')
值始终为0),都不会影响输出,即不会有缓存,这里就不去研究为什么了,这里主要想说的是ob相关的函数。
有时我们需要对输出进行严格控制,比如我要输出100k的数据,而且是一次性发送到客户端,这里我们需要用到ob相关的函数。
ob_start() //启动输出缓存
ob_get_contents() //得到缓存内容字符串
ob_flush() //刷新缓存
flush() //刷新缓存,php刷新缓存必须是同时调用ob_flush和flush,除非调用ob_implicit_flush(true)
ob_implicit_flush(true/false) //打开关闭绝对刷新缓存方式,如果为true,则手动刷新缓存时只要调用ob_flush,反之除了调用ob_flush还要调用flush
ob_clean() //清空缓存,不关闭缓存
ob_end_flush() //刷新缓存,清空并关闭缓存
ob_end_clean() //刷新缓存,清空并关闭缓存
php会在脚本执行结束时自动关闭缓存,所以可以不用显示调用ob_end_*。但良好的风格不应该省略这些,而且ob_start应该是和这些ob_end_*一一对应的.
如下代码将在for循环结束后一次性输出所有echo:
ob_start();
for($i=0; $i<=5; $i++)
{
echo date('Y-m-d H:i:s')."\n";
sleep(1);
}
ob_end_flush();
如下代码将在循环时,循环一次输出一次:
ob_start();
for($i=0; $i<=5; $i++)
{
echo date('Y-m-d H:i:s')."\n";
ob_flush();
flush(); //如果ob_implicit_flush(true)激活,则flush()可省略
sleep(1);
}
您可以选择一种方式赞助本站
支付宝扫一扫
微信扫一扫