先看一个简单的例子
<?php ob_start(); echo 111; ob_clean(); echo 222;
ob_start()开启ob缓存,然后111放进了ob缓存, 再调用ob_clean()清除缓存,最后输出的结果是222。
原理:页面执行到最后, 会把ob缓存的数据(如果有的话)强制刷新到程序缓存, 然后通过apache对数据封装成http响应包, 返回给浏览器。
注意:header头信息放程序缓存,如果没有ob缓存,则所有数据直接放程序缓存。
更多api参考 : http://php.net/manual/zh/ref.outcontrol.php
<?php for($i = 0; $i < 3; $i++){ echo $i; sleep(1); flush(); }
flush 只是刷新到浏览器缓存, 然后程序结束时再一起输出。
我把浏览器缓存占满就能看到效果.
<?php ob_end_clean(); //php.ini中设置了开启ob缓存, 所以关闭一下. echo str_repeat(' ',1024); for($i = 0; $i < 5; $i++){ echo $i; sleep(1); flush(); }
ob缓存中能存放哪些数据.
ob_start() 开始到 ob_get_contents()之间返回给浏览器的数据。
实现页面静态化可以使用正则替换, 也可以利用ob实现页面静态化。
<?php if(file_exists('index.html') && filemtime('index.html') + 60 >= time()){ echo file_get_contents('index.html'); exit; } ob_start(); ?> //这里写原来的代码 <?php $html_str = ob_get_contents(); file_put_contents('index.html', $html_str); ?>
如果内容修改, 我们看不到最新内容, 这是我们可以简单优化, 每过60秒刷新一次。