PHP输出控制

默认的PHP的echo、print之类的输出会被缓存,当缓存达到特定的大小或脚本执行结束,或强行刷新缓冲区才会发送到浏览器客户端。

php.inioutputing_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会在脚本执行结束时自动关闭缓存,所以可以不用显示调用obend。但良好的风格不应该省略这些,而且obstart应该是和这些obend_一一对应的.

如下代码将在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);
}

评论

评论正在提交中...请稍后
评论提交成功...