用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 ( 
___FCKpd___0
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)); }

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

大屏阅读,大屏评论.