在使用PHP时,大家都听过缓冲区这个概念,指的是服务器在执行PHP脚本时为了提高运行效率而采用的一种缓存机制。缓冲区将脚本对页面的输出内容存储在缓存中,当所有脚本也全部运行完之后,将所有的缓存一次性输出到浏览器。虽然缓冲区的存在确实可以提高服务器执行PHP脚本的性能,但是在某些情况下关闭这个功能也是非常必要的。
有时候,我们会发现PHP脚本无法输出内容到页面,这不一定是代码的问题,而有可能是缓冲区没有被关闭导致的。例如:
<?php header("Content-type:text/html;charset=utf-8"); $a= 10; echo $a; sleep(3); //模仿耗时操作 $b= 20; echo $b; ?>
上面的脚本按理说应该先输出 10 再过 3 秒钟之后输出 20,但是事实上它们都会在 3 秒钟之后一起输出到页面上。这是因为开启了缓存区,缓存了脚本运行过程中的输出内容,并等到脚本全部运行完毕之后才将全部的结果一起输出到页面。这就是为什么两个 echo 输出语句之间加上了 sleep 也不起到阻塞的作用的原因。
其实我们只需要关闭此功能即可得到符合预期的效果,关闭方法如下:
<?php header("Content-type:text/html;charset=utf-8"); ob_start(); //开启缓存 $a= 10; echo $a; ob_end_clean(); //关闭缓存 sleep(3); //模仿耗时操作 $b= 20; echo $b; ?>
开启缓存的方法是 ob_start(),等到脚本运行完毕之后关闭缓存的方法则是 ob_end_clean()。这样,就可以保证 PHP 脚本的所有结果都会实时输出。
需要注意的是,如果要关闭缓冲区,必须在开启输出之前调用 ob_start() 函数。如果你在开启了输出之后再调用 ob_start() 函数,则会导致脚本抛出错误信息。
PHP 缓存机制是为了提高程序的运行速度而设计的,对于简单的脚本而言,它确实可以提高性能,但是在某些特定情况下,缓存机制可能会带来麻烦。比如在需要实时输出内容的脚本中,关闭缓存器就是非常必要的。