美文网首页
文件缓存(模板缓存)

文件缓存(模板缓存)

作者: 左诗右码 | 来源:发表于2021-07-18 16:48 被阅读0次

    文件缓存(模板缓存)

    从页面片段缓存到 facebook 的 BigPipe 技术

    • 将页面划分成一个个小块
    • 利用 ob_flush() 与 flush() 将缓冲区的内容提前输出给浏览器
    • 浏览器在一个请求中不断接收并渲染到页面,逐个小块显示。
      • 注:JS 部分,不需要立刻执行的部分,可以最后再 eval 进来

    程序执行的流程为:
    program data -> php buffer -> tcp buffer -> client browers

    方法 作用 解释
    ob_start() 打开输出缓冲区
    ob_flush() 将 PHP buffer 中的内容,送出到 Tcp buffer 中 调用 ob_flush() 之后缓冲区内容将被丢弃。
    flush() 将当前为止 Tcp buffer 中内容发送到用户的浏览器。 flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和 flush() 函数来刷新输出缓冲。
    ob_get_contents() 返回内部缓冲区的内容 只是得到输出缓冲区的内容,但不清除它,没有激活,则返回 false
    ob_end_clean() 删除内部缓冲区的内容,并且关闭内部缓冲区。
    ob_end_flush() 发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区
    ob_get_length() 返回内部缓冲区的长度

    如何使用这门技术?

    • nginx 需要设置

    sudo vim /etc/nginx/nginx.conf

    
    proxy_buffering off;
    fastcgi_keep_conn on;
    
    gzip off;  // 默认是开启了压缩,需要关闭
    
    
    • php 需要设置

    sudo vim /etc/php/7.0/fpm/php.ini

    
    ;output_buffering = 4096
    output_buffering = off
    
    
    • 重启 nginx 和 php
    
    sudo service nginx restart
    sudo service php7.0-fpm restart
    
    
    • 模板中使用
    
    <?php
    // 开启缓冲区
    ob_start();
    ?>
    
    <?php
    // 模拟程序执行缓慢
    sleep(1);
    // 将 php 执行过的东西发送给 nginx 或者 apache
    ob_flush();
    // nginx 或 apache 将内容发送给客户端
    flush();
    ?>
    
    <?php
    
    // 关闭之前也需要将最后的内容发送给客户端
    ob_flush();
    flush();
    
    // 清理缓冲区
    ob_end_clean();
    ?>
    
    

    实现的效果及优势

    页面中有很多分块内容的时候,可以将许多个分块内容分批次的刷给客户端,使得客户端不需要等待所有的内容加载完毕才能看到内容。并且这种技术只有一次请求,如果采用 ajax 的话,可能会想到的是,每个分块内容使用 ajax 请求一次,这样的话就会有多个请求。

    原文地址

    相关文章

      网友评论

          本文标题:文件缓存(模板缓存)

          本文链接:https://www.haomeiwen.com/subject/jndapltx.html