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

字体大小: 中小 标准 ->行高大小: 标准
 我们可能都有这样的经验,用php写了一个打开好几个数据库,几十次数据查询的首页,速度慢是可想而知啊,但是这个页面不大好做模板生成静态页,太麻烦了。怎么办了?我使用了这个解决方案,控制php的输出缓冲,截获处理后的html,保存成文件,然后的请求就检查这个文件的时间,若在设置的时间内,直接读取,发送。如果已经超时,就重新读取动态页面。 
 

<?php 
// --------------------------------------------------------------------------
// 文件名 : index.php
// 描述 : 主站首页
// 需求 : PHP4 (http://www.php.net)

// Copyright(C), www.cnfdc.com.cn, 2005, All Rights Reserved.

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

// --------------------------------------------------------------------------
// 缓存文件名和缓存时间
$cachefilename = './cache/index.cache';
$cachetime = 3600;

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

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


//生成HTML并缓存成文件
function CacheFile()
{
 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 
 {
 return ReadCache()." outdated";
 }

 return $content.'newcache';

}

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

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/67360.html