文件缓存(模板缓存)

Posted 削个椰子皮给个梨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件缓存(模板缓存)相关的知识,希望对你有一定的参考价值。

文件缓存(模板缓存)

从页面片段缓存到 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()返回内部缓冲区的长度

如何使用这门技术?

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 请求一次,这样的话就会有多个请求。

原文地址

以上是关于文件缓存(模板缓存)的主要内容,如果未能解决你的问题,请参考以下文章

Android获取各个应用程序的缓存文件代码小片段(使用AIDL)

phalcon: 缓存片段,文件缓存,memcache缓存

django-缓存的三种应用

(13) PHP 随笔---Smarty模板引擎 缓存的高级应用 22

smarty模板基础3 *缓存数据*

静态缓存技术