博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从php到浏览器的缓存机制,不得不看!
阅读量:5064 次
发布时间:2019-06-12

本文共 1174 字,大约阅读时间需要 3 分钟。

所有的php程序员都知道在php脚本里面执行 echo “1”;访客的浏览器里面就会显示“1”。

但是我们执行下面的代码的时候,并不是显示“1”之后5秒再显示“2”,而是等待5秒后直接显示“12”

echo '1';sleep(5);echo '2';

这就涉及到几个缓存机制,为了更高的薪水,同学们非常有必要把这个缓存机制学习好。

通常情况下,我们的web应用由以下几个要素构成:

php->apache->浏览器。这篇文章我们就以这个架构为例来讲解数据是如何在整个“链条”上流通的。

 

 

看了上面的图,我们终于知道上面为什么会同时显示“12”了,因为echo '1'还没有装满php的缓存,所以“1”还在php的缓存里面,没有到浏览器,等到程序结束后“12”才一起到浏览器。

当然我们也可以手动刷新缓存

echo '1';ob_flush(); //把php缓存写入apahce缓存flush(); //把apahce缓存写入浏览器缓存sleep(5);echo '2';

我们把代码改成如上之后,浏览器还是要等5秒才同时显示“12”,这是因为“1”虽然已经发送给浏览器,但是浏览器缓存还没有装满,并没有渲染,一直到等到程序结束后才渲染出“12”。

我们以谷歌浏览器为例(缓存1000bytes),通过下面的代码,我们就可以实现先显示“1”,隔5秒再显示“2”

echo str_repeat(' ' ,1000); //这里会把浏览器缓存装满echo '1';ob_flush(); //把php缓存写入apahce缓存flush(); //把apahce缓存写入浏览器缓存sleep(5);echo '2';

 讲到这里,我们不得不提一下“ob_start()”这个函数,这个函数的作用就是开启一个新的php缓存,但是这个缓存远远不止4096,php文档中描述的是这个缓存足够大。我们还是通过代码来说明

ob_start(); echo str_repeat(' ' ,1000); //这里会把浏览器缓存装满echo '1';ob_flush(); flush(); //把apahce缓存写入浏览器缓存sleep(5);echo '2';

在原有的基础上我们仅仅加了个ob_start(),结果又变成了等5秒后同时显示"12"了。这是因为每一个ob_start()都在原来的缓存空间上开辟一个子缓存空间,ob_flush()是把当前缓存空间输出到上级缓存空间,php只有一个缓存空间的时候,上级缓存空间就是apache的缓存,当php有多个缓存空间的时候,ob_flush()的就不能把php缓存写入apache缓存了。我们还是借助图片来理解:

 

转载于:https://www.cnblogs.com/godok/p/6341300.html

你可能感兴趣的文章
JavaScript数组
查看>>
Luogu2792 JSOI2008 小店购物 最小树形图
查看>>
LOJ2014 SCOI2016 萌萌哒 并查集、ST表优化连边
查看>>
CF1097G Vladislav and a Great Legend 组合、树形背包
查看>>
POJ3184 Ikki's Story I - Road Reconstruction(最大流)
查看>>
FZU2219 StarCraft(哈夫曼树)
查看>>
转载:送给和我一样曾经浮躁过的PHP程序猿
查看>>
easyui获取行,js的eval函数转对象
查看>>
机器学习资料
查看>>
【数据挖掘】降维(PCA、流形学习)
查看>>
pku 1639 Picnic Planning 最小度限制生成树
查看>>
生活中残忍的真相
查看>>
HTTP隧道工具HTTPTunnel
查看>>
问题账户需求分析
查看>>
python UI自动化实战记录九:添加日志
查看>>
mysql关键字了解
查看>>
Adhesive框架系列文章--Mongodb数据服务使用实践
查看>>
对二维数据进行边界拓展
查看>>
asp.net 验证控件
查看>>
评论列表显示及排序,个人中心显示
查看>>