本文实例分析了PHP中常见的缓存技术。分享给大家供大家参考。具体如下:
JBLOG在开发的过程中,对性能的优化做了不少工作。为了尽量减少不必要的数据库查询,我对一些数据进行了缓存和静态化处理。
缓存的原理:把一些经常要用到但又很少改动的数据以数组或其它形式存储到一个独立的PHP文件中,然后在需要用到的时候包含进来。
缓存的优点:能够大大减少数据库的查询次数,减轻数据库的压力,提高程序的执行效率。
JBLOG缓存的数据有:系统设置、博客分类、侧栏最新日志、最新评论、博客统计、日志归档、友情链接、标签等。通过缓存这些数据,执行一次页面数据库的查询次数从十几次减少到3次。
JBLOG中与缓存相关的函数保存在include目录下的cache.func.php里,主要函数:
//刷新缓存function recache($cachestr = '') {if (!$cachestr) { $cachelist = array('config','class','archive','newcomment','newpost','link','tag','statistic','topblog');} else { $cachelist = explode(',',$cachestr); foreach ($cachelist as $cache) { $cachename = $cache.'_recache'; if (function_exists($cachename)) { $cachename(); } }}}
recache()函数用来刷新缓存,每一个缓存以独立的函数存在,刷新缓存时仅需执行一次相应的函数即可。
//将字符串写进文件function writeToFile($cachename,$content = '') {$allowcache = $cachelist = array('config','class','archive','newcomment','newpost','link','tag','statistic','topblog');if (in_array($cachename,$allowcache)) { $cache_dir = JBLOG_ROOT.'cache_data/'; $cache_file_name = $cache_dir.'cache_'.$cachename.'.php'; if (!is_dir($cache_dir)) { @mkdir($cache_dir,0777); } if ($fp = @fopen($cache_file_name,'wb')) { $content = "<?php/r/n//该文件是系统自动生成的缓存文件,请勿修改/r/n//创建时间:".date('Y-m-d H:i:s',time())."/r/n/r/nif (!defined('IN_JBLOG')) {exit('Access Denied!');}/r/n/r/n".$content."/r/n/r/n?>"; @fwrite($fp,$content); @fclose(); @chmod($cache_file_name,0777); } else { echo '缓存文件<b>'.$cache_dir.$cache_file_name.'</b>创建失败!<br />'; }} else { die('缓存名称<b>'.$cachename.'</b>不在系统允许的范围内!');}}
writeToFile() 函数用于将数据写入到缓存目录下以cache_缓存名称.php命名的文件中。
再看具体的缓存函数实例:
//缓存博客分类function class_recache() {global $db,$tablepre;$content = '';$sql = "SELECT id,classname,description,orderid,arcnum FROM `{$tablepre}class` ORDER BY orderid";$result = $db->query($sql);while ($row = $db->fetch_array($result)) { $content .= "/tarray(/r/n"; $content .= "/t'id'=>'".addslashes($row['id'])."',/r/n"; $content .= "/t'classname'=>'".addslashes($row['classname'])."',/r/n"; $content .= "/t'description'=>'".addslashes($row['description'])."',/r/n"; $content .= "/t'orderid'=>'".addslashes($row['orderid'])."',/r/n"; $content .= "/t'arcnum'=>'".addslashes($row['arcnum'])."',/r/n"; $content .= "/t),/r/n";}$content = substr($content,0,strrpos($content,','));$content = "/$class_cache = array(/r/n{$content}/r/n);";writeToFile('class',$content);}
新闻热点
疑难解答