zoukankan      html  css  js  c++  java
  • php缓存机制

    开始之前先看下php自带缓存指令:

    ob_start()  //开启缓存 php.ini中一般是4096

    ob_clean()  //清空缓存

    ob_end_clean()  //清空缓存,关闭缓存

    ob_flush() //刷新缓存(将缓存现有内容输出)  把php缓存写入apahce/nginx缓存

    flush() //把apahce/nginx缓存写入浏览器缓存

    ob_end_flush()  //刷新缓存,并关闭缓存

    $contents = ob_get_contents() //获得缓存内容

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

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

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

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

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

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

     

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

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

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

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

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

    for($i=1;$i<11;$i++){
        echo str_repeat(' ' ,1000); //这里会把浏览器缓存装满
        ob_flush(); //把php缓存写入apahce缓存
        flush(); //把apahce缓存写入浏览器缓存
        sleep(1);
        echo $i;
    }

    讲到这里,我们不得不提一下“ob_start()”这个函数,这个函数的作用就是开启一个新的php缓存。我们还是通过代码来说明

    ob_start();
    for($i=1;$i<11;$i++){
        echo str_repeat(' ' ,1000); //这里会把浏览器缓存装满
        ob_flush(); //把php缓存写入apahce缓存
        flush(); //把apahce缓存写入浏览器缓存
        sleep(1);
        echo $i;
    }

    在原有的基础上我们仅仅加了个ob_start(),结果又变成了等1秒后同时显示"1234"了,(需要将1000改为4096才会1秒显示I个)。这是因为每一个ob_start()都在原来的缓存空间上开辟一个子缓存空间,ob_flush()是把当前缓存空间输出到上级缓存空间,php只有一个缓存空间的时候,上级缓存空间就是apache的缓存,当php有多个缓存空间的时候,ob_flush()的就不能把php缓存写入apache缓存了

  • 相关阅读:
    mysql初识(五) 统计与计算与时间
    mysql初识(四)添加/修改字段信息
    mysql初识(二) 基础的查询语句
    mysql初识(三)修改表结构
    mysql初识(一)基础属性篇
    在Ubuntu上安装Docker Engine
    使用PowerDesigner对NAME和COMMENT互相转换
    mysql 5.1.34
    debian7下安装eclipse
    让 Visio 2003/2007 同时开多个独立窗口
  • 原文地址:https://www.cnblogs.com/lauhp/p/8780046.html
Copyright © 2011-2022 走看看