六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 55|回复: 0

用ob_start()控制缓冲,给页面做文件缓存,加速页面

[复制链接]

升级  23.33%

23

主题

23

主题

23

主题

秀才

Rank: 2

积分
85
 楼主| 发表于 2013-1-19 04:15:06 | 显示全部楼层 |阅读模式
我们可能都有这样的经验,用php写了一个打开好几个数据库,几十次数据查询的首页,速度慢是可想而知啊,但是这个页面不大好做模板生成静态页,太麻烦了。怎么办了?我使用了这个解决方案,控制php的输出缓冲,截获处理后的html,保存成文件,然后的请求就检查这个文件的时间,若在设置的时间内,直接读取,发送。如果已经超时,就重新读取动态页面。
<div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; width: 95%; padding-top: 4px;"><?php
//--------------------------------------------------------------------------
//文件名:index.php
//描述:主站首页
//需求:PHP4(http://www.php.net)

//Copyright(C),www.cnfdc.com.cn,2005,AllRightsReserved.

//作者:lonestone(wangyong.yichang@gmail.com)

//--------------------------------------------------------------------------
//缓存文件名和缓存时间

$cachefilename='./cache/index.cache';
$cachetime=3600;

//强制更新缓存
if($_GET['c'])
{
echoCacheFile();
die();
}

//检测缓存是否存在
if(file_exists($cachefilename))
{
$lastmodifytime=filemtime($cachefilename);
if($lastmodifytime&&(time()-$lastmodifytime)>$cachetime)
{
echoCacheFile();
}
else
{
echoReadCache();
}
}
else
{
echoCacheFile();
}


//生成HTML并缓存成文件
functionCacheFile()
{
global$cachefilename;
//打开输出缓存
ob_start();

//这里开始链接数据库,查询,用ADODB+SMARTY技术。

$tpl->Display("index.html");
//处理完成,截获缓冲内容


//得到缓存内容

$content=ob_get_contents();
//清空缓冲区,否则最终还是会输出给浏览器,这样就会有两个首页了
ob_end_clean();
//写入文件,若不可写则返回缓存
if(is_writable($cachefilename))
{
$handle=fopen($cachefilename,"w");
fwrite($handle,$content);
fclose($handle);
}
else
{
returnReadCache()."outdated";
}

return$content.'newcache';

}

//读取缓存文件
functionReadCache()
{
global$cachefilename;
$handle=fopen($cachefilename,"r");
$content='';
while(!feof($handle))
{
$line=fgets($handle);
$content.=$line;
}
fclose($handle);
return$content.'cachedat'.date("Y-m-dH:i:s",filemtime($cachefilename));
}


您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表