数据从 PHP 到服务器到浏览器的缓存机制

所有的 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 缓存了。我们还是借助图片来理解: