文件缓存(模板缓存)
文件缓存(模板缓存) 从页面片段缓存到 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 需要设置
proxy_buffering off;
fastcgi_keep_conn on;
gzip off;
// 默认是开启了压缩,需要关闭
- php 需要设置
;
output_buffering = 4096
output_buffering = off
- 重启 nginx 和 php
sudo service nginx restart
sudo service php7.0-fpm restart
- 模板中使用
实现的效果及优势
页面中有很多分块内容的时候,可以将许多个分块内容分批次的刷给客户端,使得客户端不需要等待所有的内容加载完毕才能看到内容。并且这种技术只有一次请求,如果采用 ajax 的话,可能会想到的是,每个分块内容使用 ajax 请求一次,这样的话就会有多个请求。
原文地址
推荐阅读
- opencv|opencv C++模板匹配的简单实现
- django-前后端交互
- 如何在Mac中的文件选择框中打开系统隐藏文件夹
- 使用composer自动加载类文件
- 不废话,代码实践带你掌握|不废话,代码实践带你掌握 强缓存、协商缓存!
- ssh生成公钥秘钥
- web网页模板|如此优秀的JS轮播图,写完老师都沉默了
- 15、IDEA学习系列之其他设置(生成javadoc、缓存和索引的清理等)
- Android系统启动之init.rc文件解析过程
- springboot使用redis缓存