默认的PHP的echo、print之类的输出会被缓存,当缓存达到特定的大小或脚本执行结束,或强行刷新缓冲区才会发送到浏览器客户端。
php.ini的 outputing_buffer字段默认是4096,表示缓存的大小,如果大于该值则会像浏览器客户端输出。但是我发现该值不管怎么改( ini_get('outputing_buffer')值始终为0),都不会影响输出,即不会有缓存,这里就不去研究为什么了,这里主要想说的是ob相关的函数。
有时我们需要对输出进行严格控制,比如我要输出100k的数据,而且是一次性发送到客户端,这里我们需要用到ob相关的函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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:
1 2 3 4 5 6 7 |
ob_start(); for($i=0; $i<=5; $i++) { echo date('Y-m-d H:i:s')."\n"; sleep(1); } ob_end_flush(); |
如下代码将在循环时,循环一次输出一次:
1 2 3 4 5 6 7 8 |
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); } |