php程序缓存的概念
首先,修改php.ini配置项为
;output_buffering = 4096
来看个例子
//test.php
<?php
for($i = 0; $i < 10; $i++){
echo $i;
sleep(1);
}
//效果:浏览器停顿10秒,第十秒才一次输出0123456789
修改代码为
//test.php
<?php
for($i = 0; $i < 10; $i++){
echo $i;
sleep(1);
flush();//将程序缓存的内容强制刷新到浏览器上
}
//效果:浏览器每隔一秒输出一个数字
这就是php程序缓存的概念:test.php从上到下执行,所有的输出都会先放到程序缓存,整个test.php执行完毕,才把程序缓存里的内容打包,发送给浏览器
ob缓存的概念
接下来,再修改php.ini,output_buffering = 4096(去掉前面的分号)
//test.php
<?php
for($i = 0; $i < 10; $i++){
echo $i;
sleep(1);
flush();//将程序缓存的内容刷新到浏览器上
}
//效果:浏览器停顿10秒,第十秒才一次输出0123456789
ob缓存开启时,test.php中的输出先放到了ob缓存,整个test.php执行完毕,才将所有输出结果刷新到程序缓存中
ob缓存的特性和相关函数
再看一个例子:
关闭ob缓存,;output_buffering = 4096
//test2.php
<?php
echo 'hello100';
header('charset=utf-8');
echo 'hello200';
//效果:会报错,提示不能修改header头(http协议有head和body,要求head必须在body上)
开启ob缓存,output_buffering = 4096
//test2.php
<?php
echo 'hello100';
header('charset=utf-8');
echo 'hello200';
//效果:不会报错,正常输出。
//执行过程分析:'hello100'放入ob缓存,header放入程序缓存,'hello200'放入ob缓存。test2.php执行完毕,将ob缓存中的'hello100''hello200'刷新到程序缓存中,这样header头信息仍然在ob缓存内容的上面,故不会报错
ob缓存的特性:只缓存输出内容(echo/var_dump/print_r()/html文本),而header信息,是不会执行ob缓存的,直接放在程序缓存
//ob缓存的其他函数
ob_start();
ob_end_flush();//将ob缓存中的内容,刷到程序缓存中!并关闭ob缓存
ob_flush();//将ob缓存中的内容,刷到程序缓存中!但并没有关闭ob缓存
ob_get_contents();//获取当前ob缓存中的内容
ob_clean();//将ob缓存中的内容清空
ob_end_clean();//将ob缓存中的内容清空,并关闭ob缓存
ob缓存的应用
实现页面静态化,代码不优雅,理解思路即可
<?php
$id=$_REQUEST['id'];
//判断缓存文件是否存在,如果存在,直接输出
if(file_exists('content'.$id.'.html')){
echo file_get_contents('content'.$id.'.html');
return;
}
//开启缓存机制
ob_start();
//到数据库中查询所需要的内容
$conn=mysql_connect("localhost","root","root");
mysql_select('db');
mysql_query('set names utf8');
$sql="select content from table_name where id=$id";
$res=mysql_query($sql);
$row=mysql_fetch_assoc($res);
$content=$row[0];
mysql_free_result($res);
mysql_close($conn);
echo $content;
//将输出的内容保存到文件中,形成静态页面,在下次访问的时候,直接读取输出
file_put_contents('content'.$id.'.html',ob_get_contents());
?>