千家信息网

PHP如何输出缓存

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章将为大家详细讲解有关PHP如何输出缓存,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先明确一下PHP的输出顺序1.打开了php输出缓存: echo,pri
千家信息网最后更新 2026年11月01日PHP如何输出缓存

这篇文章将为大家详细讲解有关PHP如何输出缓存,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

首先明确一下PHP的输出顺序
1.打开了php输出缓存: echo,print -> php output_buffring -> server buffering -> browser buffering -> browser display
2.未打开php输出缓存: echo,print -> server buffering -> browser buffering -> browser display

另外明确一下浏览器的输出缓存: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(),需要等到server buffering满了才会输出,但是我们可以用flush()函数代替它,不开启也没关系,反而更加灵活

3.ob_flush()函数: 取出PHP buffering中的数据,放入server buffering

4.flush()函数: 取出Server buffering的数据,放入browser buffering

5.ob_start()函数:对于这个函数我现在了解的不是很清楚,因为开启后输出就会不受ob_flush()控制,即使使用ob_flush()和flush(),数据也不能立即输出在浏览器上.现在知道的是,如果output_buffering=Off,即使使用了ob_start(),也是无法将输出数据缓存的,而如果output_buffering=On的话,即使不用ob_start(),输出数据也可以被PHP缓存,所以觉得ob_start比较废,暂时不管他

然后我们来看代码吧(设置output_buffering=4096,implicit_flush=Off)

复制代码 代码如下:




// ob_start(); //这玩意开了就会不正常,输出不受ob_flush()控制,不知道到底干嘛用
// echo str_repeat(' ' ,1000); //IE缓存256Bytes
echo str_repeat(' ' ,1000); //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了
for($i=0;$i<5;$i++) {
echo $i.'
';
ob_flush();
flush();
sleep(1);
}
?>



这里代码输出结果是一行一行输出的,具体原理大家参考一下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)的缓冲区.

在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针, 间接的调用apache的api: ap_rflush刷新apache的输出缓冲区, 当然手册中也说了, 有一些apache的其他模块, 可能会改变这个动作的结果..
1.有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,
2.这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
3.
4.甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape
5.浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在
6.接受到 标记之前,不会显示出整个表格。
7.
8.一些版本的 Microsoft Internet Explorer 只有当接受到的256个
9.字节以后才开始显示该页面,所以必须发送一些额外的空格来让这
10.些浏览器显示页面内容。
所以, 正确使用俩者的顺序是. 先ob_flush, 然后flush,
当然, 在其他sapi下, 不调用flush也可以, 只不过为了保证你代码的可移植性, 建议配套使用.

关于"PHP如何输出缓存"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

输出 缓存 函数 浏览器 浏览 数据 代码 缓冲区 缓冲 内容 一行 只有 篇文章 结果 页面 手册 更多 标记 模块 顺序 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 什么是科技互联网 保险科技 互联网保险 南京欣网互联网络科技有限公司 北京路客互联网科技有限公司 互联网科技工作委员会副主任毛军 互联网中国科技 齐家互联网科技 奇酷互联网络科技公司 广州善班互联网科技 互联网科技有限公司 翻译 互联网科技生活的内容 蓝色互联网科技 科技赋能互联网健康 隆华科技工业互联网 互联网科技博主是什么意思 金融科技与互联网金融相同和不同 卡尔迅互联网科技有限公司 广州梦谷互联网科技有限公司领导 杭州融税互联网科技有限公司 长沙易易互联网科技有限公司 伟宏互联网科技 科技互联网政务服务 华中科技大学互联网 兼蜜互联网科技 呼和浩特新华互联网科技学院 特约风豹互联网科技为什么扣费 科技互联网的核心竞争力 互联网领先科技宣传片 银川新华互联网科技学校原画 互联网对科技影响
0