https://www.cnblogs.com/godok/p/6341300.html
我们执行下面的代码的时候,并不是显示“1”之后5秒再显示“2”,而是等待5秒后直接显示“12”
echo '1';
sleep(5);
echo '2';
缓存机制
通常情况下,我们的web应用由以下几个要素构成:
php->apache->浏览器。这篇文章我们就以这个架构为例来讲解数据是如何在整个“链条”上流通的。
用到的函数:
ob_flush() — 输出缓冲区中的内容,并删除内部缓冲区的内容,但不关闭缓冲区。 (当前缓存空间输出到上级缓存空间,如把php缓存写入apahce缓存)
flush() — 刷新输出缓冲(将ob_flush 释放出来的内容,以及不在PHP缓冲区的内容,全部输出至浏览器。)(如把apahce缓存写入浏览器缓存)
看了上面的图,我们终于知道上面为什么会同时显示“12”了,因为echo ‘1’ 还没有装满php的缓存(4MB),所以“1”还在php的缓存里面,没有到Apache服务器,还没有浏览器,浏览器的缓存还没有装满,
如果我们手动把1发送到浏览器缓存,但是浏览器缓存还没有装满,并没有渲染,一直等到程序结束后才渲染出“12”。当然我们也可以手动刷新缓存
<?
echo '1';
ob_flush(); //把php缓存写入apahce缓存
flush(); //把apahce缓存写入浏览器缓存
sleep(5);
echo '2';
我们把代码改成如上之后,浏览器还是要等5秒才同时显示“12”,
我们以谷歌浏览器为例(缓存1000bytes),通过下面的代码,我们就可以实现先显示“1”,因为已近超出浏览器缓存的上限了,所以先输出1;隔5秒再显示“2”
<?php
echo str_repeat(' ' ,1000); //重复1000次空格,一个空格1字节,把浏览器缓存装满,
echo '1';
ob_flush(); //把php缓存写入apahce缓存
flush(); //把apahce缓存写入浏览器缓存
sleep(5);
echo '2';
ob_start
讲到这里,我们不得不提一下“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缓存了。我们还是借助图片来理解: