基于PHP输出缓存(output_buffering)的深入理解
首先明确一下PHP的输出顺序
另外明确一下浏览器的输出缓存:IE为256Bytes,Chrome与FireFox为1000Bytes,只有输出数据达到了这个长度或者脚本结束浏览器才会将数据输出在页面上
再来说说用到的几个PHP设置和API:
1.php.ini中的output_buffering配置
•Off:表示关闭PHP输出缓存
•On:打开无限大的输出缓存
•4096:打开大小为4096Byte的输出缓存
2.php.ini中的implicit_flush配置
•On:表示每次输出(如echo,print)后自动调用flush()函数后,直接输出
•Off:与On相反,每次输出后不会调用flush(),需要等到serverbuffering满了才会输出,但是我们可以用flush()函数代替它,不开启也没关系,反而更加灵活
3.ob_flush()函数:取出PHPbuffering中的数据,放入serverbuffering
4.flush()函数:取出Serverbuffering的数据,放入browserbuffering
5.ob_start()函数:
然后我们来看代码吧(设置output_buffering=4096,implicit_flush=Off)
<html>
<body>
<?php
//ob_start(); //这玩意开了就会不正常,输出不受ob_flush()控制,不知道到底干嘛用
//echostr_repeat("",1000); //IE缓存256Bytes
echostr_repeat("",1000); //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了
for($i=0;$i<5;$i++){
echo$i."<br/>";
ob_flush();
flush();
sleep(1);
}
?>
</body>
</html>
这里代码输出结果是一行一行输出的,具体原理大家参考一下ob_flush()和flush()函数的功效
这两个函数缺了任何一个在我这种设置下都是要等到0,1,2,3,4都缓存起来后最后一起输出
最后引用一段Laruence的一段blog,希望对大家的理解有帮助
ob_flush/flush在手册中的描述,都是刷新输出缓冲区,并且还需要配套使用,所以会导致很多人迷惑…
其实,他们俩的操作对象不同,有些情况下,flush根本不做什么事情..
ob_*系列函数,是操作PHP本身的输出缓冲区.
所以,ob_flush是刷新PHP自身的缓冲区.
而flush,严格来讲,这个只有在PHP做为apache的Module(handler或者filter)安装的时候,才有实际作用.它是刷新WebServer(可以认为特指apache)的缓冲区.
在apachemodule的sapi下,flush会通过调用sapi_module的flush成员函数指针,间接的调用apache的api:ap_rflush刷新apache的输出缓冲区,当然手册中也说了,有一些apache的其他模块,可能会改变这个动作的结果..
2.这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
3.
4.甚至浏览器也会在显示之前,缓存接收到的内容。例如Netscape
5.浏览器会在接受到换行或html标记的开头之前缓存内容,并且在
6.接受到</table>标记之前,不会显示出整个表格。
7.
8.一些版本的MicrosoftInternetExplorer只有当接受到的256个
9.字节以后才开始显示该页面,所以必须发送一些额外的空格来让这
10.些浏览器显示页面内容。
所以,正确使用俩者的顺序是.先ob_flush,然后flush,
当然,在其他sapi下,不调用flush也可以,只不过为了保证你代码的可移植性,建议配套使用.
相关文章
- 宝塔新建php文件实现百度自动推送
- 23-物联网开发终端管理篇-PHP使用SQL Relay数据库连接池连接数据库(.Windows系统)
- PHP 浏览器缓存_php缓存引擎
- PHP 5.3.18 发布
- PHP与MySQL无缝对接,构建强大数据库应用(php整合mysql)
- 使用PHP操作Redis的入门实践(php中使用redis)
- PHP Fatal error: Uncaught Error: Call to undefined function pcntl_fork().. 开启php pcntl扩展实现多进程详解编程语言
- 深入学习:PHP如何配置MySQL(php如何配置mysql)
- PHP扩展Redis:建立强大的缓存架构(php扩展redis)
- PHP与MySQL的网站搭建指南(php和mysql搭建)
- 使用PHP实现Redis分布式缓存(php实例化redis)
- PHP与MySQL圣经:完整指南及最佳实践。(php与mysql圣经)
- PHP编程查询MySQL数据库:入门指南(php 查询 mysql)
- 从PHP中解锁MSSQL的精彩!(php连mssql类)
- 开启创新之旅Redis与PHP的结合(开启 redis php)
- Php部分常见问题总结
- linux下安装apache与php;Apache+PHP+MySQL配置攻略
- PHP中的extract的作用分析
- php禁止页面缓存输出
- php连接mssql数据库初学php笔记
- PHP通过iconv将字符串从GBK转换为UTF8字符集
- php教程插件机制在PHP中实现方案
- php多层数组与对象的转换实例代码
- 如何使用“PHP”彩蛋进行敏感信息获取
- php读取csv实现csv文件下载功能
- 详谈PHP文件目录基础操作