Heim  >  Artikel  >  Backend-Entwicklung  >  php 输出缓存的魅力

php 输出缓存的魅力

巴扎黑
巴扎黑Original
2016-11-21 09:59:341719Durchsuche

php 输出缓存的魅力 


一:输出缓存介绍 

在php所谓的输出缓存,就是代码中的echo 或者其他输出命令在执行的时候是先写入到 php buffer,在脚本执行完或者强制执行输出缓存的命令后,才会把数据输出到浏览器(其中php buffer 就是php.ini中设置的output_buffering ,默认是on,表明无限制大小,可以换成数字来限制大小)。 

例子: 

echo 'hlmblog.com'; 
echo '技术'; 
echo '分享'; 


这两个echo 是按顺序插入到缓冲区的,只有脚本执行完成或者强制执行缓存输出才会把数据输出到浏览器。 
如果我想要实时地输出echo的数据,见下面的代码: 


我想要实时地输出echo的数据,见下面的代码: 

ob_end_flush(); //关闭php缓存,或者在flush()前先执行ob_flush(),下面有解释 
echo str_pad(" ", 256);  
for ($i=5; $i>0; $i--) {  
   echo $i. '
';  
   flush();  
   sleep(1);   


注意: 
注意: 

1:flush和ob_flush 区别: 
乍看之下两者很像,而且很多手册的解释也不清楚,模凌两可,其实两者是有很大区别的。 
当php.ini没有开启php buffer缓存时,php脚本输出的内容都会在服务端处于等待输出状态 ,不会保存到输出缓存,因为缓存都没开,此时利用flush可以将那些等待输出的内容立即输出来发到客户端(浏览器或者其他输出端)。 
当php.ini开启了php buffer缓存后,php脚本输出内容的第一步是存储在输出缓存中 ,此时等到输出的内容是没有数据的,用flush的话是无效果,取不到数据的。因此要先利用ob_flush把输出缓存中的内容取出来变成等待输出的状态,接下来在利用flush把内容发到客户端。执行的顺序是先ob_flush 再 flush。 
因此要实现实时地输出,要么利用ob_end_flush 先关掉php 输出缓存后直接flush,要么先 ob_flush再flush。 
2:浏览器无法输出实时数据 
把代码改成下面的代码,在chrome firefox ie等浏览器都是一次性输出的,很奇葩的现象: 

ob_end_flush(); //关闭php缓存,或者在flush前ob_flush(); 
echo str_pad(" ", 256);  
for ($i=5; $i>0; $i--) {  
   echo $i;  
   flush();  
   sleep(1);   


找了半天的bug,终于发现了个现象,只要顺便加个html标签,即可实时输出。 
原因是:只有在遇到html标签的时候才会即时输出,真是神奇,还好一般输出的内容都会带着html标签,很少纯文本。 
解决办法:加个回车或者其他的html标签即可解决问题。 
二:控制缓存输出可以用来做什么,具体的几个示例 
1:生成静态页面 
静态页面的加载速度就是快,这句话是家户喻晓的道理,不用请求数据库,这是多么爽的事情啊。 
下面是生成静态页面的例子: 

echo str_pad('', 1024);//使缓冲区溢出 
ob_start();//打开缓冲区 
$content = ob_get_contents();//获取页面输出的内容 
$f = fopen('./index.html', 'w'); 
fwrite($f, $content);//内容写入txt文件 
fclose($f); 
ob_end_clean();//清空并关闭缓冲区 

传说中的静态页面就这样简单的生成。 
2:捕获输出 

function test($param) { 
  if($param) { 
    ob_start(); 
    eval($param); 
    $contents = ob_get_contents(); 
    ob_end_clean(); 
  }else { 
    echo '遗憾的没有输出'; 
    exit(); 
  } 
  return $contents; 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn