PHP buffer的机制
PHP的buffer是这样的:
输出的字符串 => PHP buffer => 等待输出 => web 服务器的缓冲区 => tcp 缓冲区 => 客户端。过程其实相当的复杂。
大概的工作机制:
bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] ) 这个函数我关键要强调一下第二个参数:
如果可选参数 chunk_size 被赋值了,在任何一个能引起缓冲区的长度等于或超过 chunk_size 的输出操作后,缓冲区都会被刷送。 默认值 0 意味着脚本结束之后,缓冲区会被刷送,其余的特殊值可以将 chunk_size从 1 设定到 4096。
这个参数默认是0.
还有一点,缓冲区是可以嵌套的。这点非常关键。比如你调用了两次ob_start ,就会创建用两个缓冲区。第二次创建的缓冲区,会写入第一次创建的缓冲区,而ob_start 创建的缓冲区,总是会写入output_buffering =ON 时候系统自动创建的缓冲区。
我们再来看一下:ob_end_flush ,这个函数的作用是把最后一次打开的缓冲区关闭掉,并把内容送入下一个缓冲区。如果下一个缓冲区没有,就进入等待输出的状态了。
flush是刷新等待输出的内容去浏览器。前提是内容是等待输出的状态了,而不是在缓冲区中,它不会影响缓冲区的内容。
再来看你的代码:
如果output_buffering = On ,那么系统会默认创建一个缓冲区,这个大小一般是2K. ob_end_flush的内容会进入这个缓冲区,而不会进入输出等待。所以调用flush一点效果都没有。直到脚本结束,PHP送出所有的内容。
如果output_buffering = Off ob_end_flush的内容会进入输出等待状态,这个时候flush一下,内容就能输出了。
当然,这个只是PHP这一端的情况分析。
还会有其他的因数影响最终的输出:
个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。
有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。
一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
PHP buffer的机制的更多相关文章
- Linux内存管理Swap和Buffer Cache机制
		
Linux内存管理Swap和Buffer Cache机制 一个完整的Linux系统主要有存储管理,内存管理,文件系统和进程管理等几方面组成,贴出一些以前学习过的一个很好的文章.与大家共享!以下主要说明 ...
 - Log Buffer
		
Log Buffer 一.Log Buffer的引入 Oracle有一个原则:只要是已经提交的数据,就不会丢失,保证数据库的一致性.这该如何实现?事物提交时,直接写入dbf中,效率是极低的.因为直接写 ...
 - Node闲谈之Buffer
		
在刚接触Nodejs的时候,有些概念总让学前端的我感到困惑(虽然大学的时候也是在搞后端,世界上最好的语言,you know).我可以很快理解File System,Path等带有明显功能的模块,却一下 ...
 - Linux内存管理机制简析
		
Linux内存管理机制简析 本文对Linux内存管理机制做一个简单的分析,试图让你快速理解Linux一些内存管理的概念并有效的利用一些管理方法. NUMA Linux 2.6开始支持NUMA( Non ...
 - Python使用Zero-Copy和Buffer Protocol实现高性能编程
		
无论你程序是做什么的,它经常都需要处理大量的数据.这些数据大部分表现形式为strings(字符串).然而,当你对字符串大批量的拷贝,切片和修改操作时是相当低效的.为什么? 让我们假设一个读取二进制数据 ...
 - MySql 缓冲池(buffer pool) 和 写缓存(change buffer)  转
		
应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库. 操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问. M ...
 - 普通索引和唯一索引如何选择(谈谈change buffer)
		
假设有一张市民表(本篇只需要用其中的name和id_card字段,有兴趣的可以翻看“索引”篇,里面有建表语句) 每个人都有一个唯一的身份证号,且业务代码已经保证不会重复. 由于业务需求,市民需要按身份 ...
 - .NET程序优化
		
一.数据库操作 1. 用完马上关闭数据库连接 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证, 比较耗费服务器资 源.ASP.NET 中提供了连 ...
 - Actor的原理
		
先从著名的c10k问题谈起.有一个叫Dan Kegel的人在网上(http://www.kegel.com/c10k.html)提出:现在的硬件应该能够让一台机器支持10000个并发的client.然 ...
 
随机推荐
- 【前端】react学习阶段总结,学习react、react-router与redux的这些事儿
			
前言 借用阮一峰的一句话:真正学会 React 是一个漫长的过程. 这句话在我接触react深入以后,更有感触了.整个react体系都是全新的,最初做简单的应用,仅仅使用react-tools打包js ...
 - mysql简单主从复制(二)
			
mysql的简单主从复制 主从复制打开后,各自开启的线程: master端 mysql> show processlist\G; *************************** 1. r ...
 - java‘小秘密’系列(三)---HashMap
			
java'小秘密'系列(三)---HashMap java基础系列 java'小秘密'系列(一)---String.StringBuffer.StringBuilder java'小秘密'系列(二)- ...
 - MySQL DNS反查导致连接缓慢
			
场景 机器A上的一个模块连接机器B上的MySQL,在实验室网络环境下正常:同样A.B两台机器,网络环境切换为与外界隔离的一个小型局域网环境,A上的模块与B上MySQL建立连接非常慢. 环境 SuS ...
 - css  禁止长按保存功能
			
*{-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;} 或者指定某个元 ...
 - 九九乘法表实现---基于python
			
# coding:utf-8"""九九乘法表"""for k in range(1,10): for i in range(1,k+1 ...
 - Java中 Comparator接口 与Comparable 的区别
			
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt159 comparator接口与Comparable接口的区别 1. Com ...
 - 操作系统-实验一、DOS使用命令实验
			
实验一.DOS使用命令实验 一.实验目的 DOS是市场上早期获得巨大成功的桌面操作系统,现在很多同学都不太熟悉.本实验的目的就是让同学们读者从操作系统理论的观点来重新认识它们,了解和掌握DO ...
 - Java课程设计——博客作业教学数据分析系统(201521123091 李嘉廉)
			
#课程设计--博客作业教学数据分析系统(201521123084 李嘉廉) 1.团队课程设计博客链接 博客作业教学数据分析系统 2.个人负责模块或任务说明 數據分析 Kmeans聚類算法實現 多元綫性 ...
 - 团队作业8----第二次项目冲刺(Beta阶段) 第二天
			
BETA阶段冲刺第二天 1.开了个小会议 2.每个人的工作 (1) 昨天已完成的工作: 昨天把学生的登录功能完善了并且优化了下界面 (2) 今天计划完成的工作: (3) 工作中遇到的困难: 1.团队还 ...