概念
缓冲(buffer)是为了协调吞吐速度相差很大的设备之间数据传送而采用的技术,用来存放缓冲数据的区域叫缓冲区,在计算机科学领域,当数据从一个地方传送到另一个地方时,缓冲区被用来临时存储数据。
与缓冲相似的一个技术是缓存(cache),它们都是为了解决数据存储和传输速度不同而带来的问题,不同的是,缓冲主要在写时使用,而缓存主要用来在读时使用。
web输出流程
php缓冲
php输出结果先放入缓冲区,只有当缓冲区满了或者php运行完毕,数据才会真正输出
缓冲区通过php.ini的output_buffering选项控制的,output_buffering默认值是Off,开启后可用ob_flush()立即刷新输出。
无法通过ini_set来设置output_buffering
cli模式下output_buffering始终是关闭的,如有需要,可使用ob_start()开启缓冲区
|
|
web服务器缓冲
apache
php输出数据给apache时,apache也会做一层缓冲。可以在php端使用flush()来强制刷新缓冲区。
flush函数的工作原理:在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针, 间接的调用apache的api: ap_rflush刷新apache的输出缓冲区.
SAPI: Server abstraction API,它提供了一个接口,使得PHP可以和其他应用进行交互数据,具体点说是提供了一个和外部通信的接口
nginx
通过设定 header(‘X-Accel-Buffering: no’) 关闭当前连接的代理缓冲
X-Accel-Buffering 选项表示设定当前连接的代理缓冲
浏览器缓冲
在php端无法关闭浏览器缓冲区。通常使用填满缓冲区的方式来达到及时输出内容。为了保险期间,可以发送4096个空格,因为目前比较流行的浏览器的buffer还没有超过4k(一个内页大小)。
参考
http://www.bo56.com/%E4%BB%8Ephp%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E8%AF%B4%E8%B5%B7/
https://www.hitoy.org/php-output-buffer.html
http://www.cnblogs.com/liuzhang/p/4161213.html