从php到浏览器的缓存机制,不得不看!

<p>所有的php程序员都知道在php脚本里面执行 echo &quot;1&quot;;访客的浏览器里面就会显示&quot;1&quot;。</p><p>但是我们执行下面的代码的时候,并不是显示&quot;1&quot;之后5秒再显示&quot;2&quot;,而是等待5秒后直接显示&quot;12&quot;</p><pre class="brush:php;toolbar:false">echo&#39;1&#39;; sleep(5); echo&#39;2&#39;;</pre><p>这就涉及到几个缓存机制,为了更高的薪水,同学们非常有必要把这个缓存机制学习好。</p><p>通常情况下,我们的web应用由以下几个要素构成:</p><p>php-&gt;apache-&gt;浏览器。这篇文章我们就以这个架构为例来讲解数据是如何在整个&quot;链条&quot;上流通的。</p><p><img src="/up_pic/201805/081031405585.png" title="081031405585.png" alt="1.png"/></p><p>看了上面的图,我们终于知道上面为什么会同时显示&quot;12&quot;了,因为echo &#39;1&#39;还没有装满php的缓存,所以&quot;1&quot;还在php的缓存里面,没有到浏览器,等到程序结束后&quot;12&quot;才一起到浏览器。</p><p>当然我们也可以手动刷新缓存</p><pre class="brush:php;toolbar:false">echo&#39;1&#39;; ob_flush();//把php缓存写入apahce缓存 flush();//把apahce缓存写入浏览器缓存 sleep(5); echo&#39;2&#39;;</pre><p>我们把代码改成如上之后,浏览器还是要等5秒才同时显示&quot;12&quot;,这是因为&quot;1&quot;虽然已经发送给浏览器,但是浏览器缓存还没有装满,并没有渲染,一直到等到程序结束后才渲染出&quot;12&quot;。</p><p>我们以谷歌浏览器为例(缓存1000bytes),通过下面的代码,我们就可以实现先显示&quot;1&quot;,隔5秒再显示&quot;2&quot;</p><pre class="brush:php;toolbar:false">echostr_repeat(&#39;&#39;,1000);//这里会把浏览器缓存装满 echo&#39;1&#39;; ob_flush();//把php缓存写入apahce缓存 flush();//把apahce缓存写入浏览器缓存 sleep(5); echo&#39;2&#39;;</pre><p>讲到这里,我们不得不提一下&quot;ob_start()&quot;这个函数,这个函数的作用就是开启一个新的php缓存,但是这个缓存远远不止4096,php文档中描述的是这个缓存足够大。我们还是通过代码来说明</p><pre class="brush:php;toolbar:false">ob_start(); echostr_repeat(&#39;&#39;,1000);//这里会把浏览器缓存装满 echo&#39;1&#39;; ob_flush(); flush();//把apahce缓存写入浏览器缓存 sleep(5); echo&#39;2&#39;;</pre><p>在原有的基础上我们仅仅加了个ob_start(),结果又变成了等5秒后同时显示&quot;12&quot;了。这是因为每一个ob_start()都在原来的缓存空间上开辟一个子缓存空间,ob_flush()是把当前缓存空间输出到上级缓存空间,php只有一个缓存空间的时候,上级缓存空间就是apache的缓存,当php有多个缓存空间的时候,ob_flush()的就不能把php缓存写入apache缓存了。我们还是借助图片来理解:</p><p><img src="/up_pic/201805/081031502052.png" title="081031502052.png" alt="2.png"/></p>
RangeTime:0.006838s
RangeMem:206.53 KB
返回顶部 留言