BigPipe笔记

BigPipe是一种提高网页响应速度的技术。


先上例子:



 
    BigPipe Demo 3
   
 
 
   
   

Loading…


   
 
       ob_start();
     ob_flush();
     flush();
     sleep(1);
     $header = str_pad('111111', 4096);
     ?>
 
       ob_flush();
     flush();
     sleep(1);
     $content = str_pad('222222', 4096);
     ?>
 
       ob_flush();
     flush();
     sleep(1);
     $footer = str_pad('333333', 4096);
     ?>
 
       ob_flush();
     flush();
     sleep(1);
     $footer = str_pad('333333', 4096);
     ?>
 
       ob_flush();
     flush();
     ?>



配置:
php.ini中的output_buffering要设置成4096。如果使用的网页服务器是Nginx,需要关闭gzip和fastcgi_buffers。fastcgi_buffers通常配置在文件conf/fastcgi_params中,通过include在nginx.conf中引用。
 
解释:
  使用ob_flush、flush和str_pad三个函数,是为了将当前已经渲染的页面发送到浏览器。没有采用Big pipe技术时,页面是全部生成完毕后,再发送到浏览器端。浏览器端只有一次渲染。而采用Big pipe技术时,页面被拆分成多个小块,然后像流一样传送到浏览器的。服务器生成一块页面就发送一块,浏览器也会有多次渲染,浏览器收到一块页面就渲染一块。页面总的加载时间没有变化,但是浏览器开始渲染的时间提前,用户体验更好。而且和采用Ajax的方式相比,Big pipe只有一次tcp连接,编码复杂度也很低。Big pipe的流程大概是:
     服务器             浏览器            用户
  生成页面块1  --->  渲染页面块1  --->  浏览页面块1
  生成页面块2  --->  渲染页面块2  --->  浏览页面块2
  生成页面块3  --->  渲染页面块3  --->  浏览页面块3
 
使用的函数:
  bool ob_start([callback $output_callback[, int $chunk_size[, bool $erase]]])
  打开output buffer。当output buffer是打开的,php不会发送数据,而是写到output buffer中。
 
  void ob_flush(void);
  将output buffer中的数据发送出去。手动使用ob_flush、flush和str_pad,是为了在输出页面时,保证输出的一个完成的html标签。如果由php管理缓存的刷新,可能出现输出不完整的html标签,导致页面和最终页面(全部加载完毕)的不一样。
 
  void flush(void);
  刷新php的write buffers。
 
  string str_pad(string $input, int $pad_length[, string $pad_string = ""[, int $pad_type = STR_PAD_RIGHT]]);
  是用指定字符填充字符串。使用时pad_length应该和output_buffering的设置一致。
 
参考: 
http://huoding.com/2011/06/26/88
http://www.alibuybuy.com/posts/66345.html
http://www.oschina.net/p/bigpipe/similar_projects
http://www.cnblogs.com/mofish/archive/2011/11/03/2234858.html
 

你可能感兴趣的:(BigPipe笔记)