web输出缓冲区

概念

缓冲(buffer)是为了协调吞吐速度相差很大的设备之间数据传送而采用的技术,用来存放缓冲数据的区域叫缓冲区,在计算机科学领域,当数据从一个地方传送到另一个地方时,缓冲区被用来临时存储数据。

与缓冲相似的一个技术是缓存(cache),它们都是为了解决数据存储和传输速度不同而带来的问题,不同的是,缓冲主要在写时使用,而缓存主要用来在读时使用。

web输出流程

20170627149856592616818.png

php缓冲

php输出结果先放入缓冲区,只有当缓冲区满了或者php运行完毕,数据才会真正输出
缓冲区通过php.ini的output_buffering选项控制的,output_buffering默认值是Off,开启后可用ob_flush()立即刷新输出。

无法通过ini_set来设置output_buffering
cli模式下output_buffering始终是关闭的,如有需要,可使用ob_start()开启缓冲区

1
2
3
4
5
6
7
8
9
10
11
12
13
//ob_*系列函数 操作php本身输出缓冲区
ob_start() 开启缓冲区
ob_flush() 刷新缓冲区
ob_implicit_flush() 开启/关闭绝对刷送
ob_clean() 清空缓冲区
ob_get_contents() 获取缓冲区内容
ob_get_clean() 获取缓冲区内容并清空
ob_get_flush() 获取缓冲区内容并刷新
ob_get_length() 获取缓冲区内容长度
ob_end_flush() 获取缓冲区内容并关闭缓冲区
ob_end_clean() 清空缓冲区内容并关闭缓冲区
flush() 刷新apache缓冲

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