文件缓存(模板缓存)

从页面片段缓存到 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 = 4096output_buffering = off
  • 重启 nginx 和 php
sudo service nginx restartsudo service php7.0-fpm restart
  • 模板中应用
<?php// 开启缓冲区ob_start();?><?php// 模拟程序执行迟缓sleep(1);// 将 php 执行过的货色发送给 nginx 或者 apacheob_flush();// nginx 或 apache 将内容发送给客户端flush();?><?php// 敞开之前也须要将最初的内容发送给客户端ob_flush();flush();// 清理缓冲区ob_end_clean();?>

实现的成果及劣势

页面中有很多分块内容的时候,能够将许多个分块内容分批次的刷给客户端,使得客户端不须要期待所有的内容加载结束能力看到内容。并且这种技术只有一次申请,如果采纳 ajax 的话,可能会想到的是,每个分块内容应用 ajax 申请一次,这样的话就会有多个申请。

原文地址