找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1992|回复: 0
打印 上一主题 下一主题

PHP中常见的缓存技术实例分析

[复制链接]

2487

主题

2487

帖子

7391

积分

论坛元老

Rank: 8Rank: 8

积分
7391
跳转到指定楼层
楼主
发表于 2018-2-14 05:42:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            本文实例分析了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 = "";
  @fwrite($fp,$content);
  @fclose();
  @chmod($cache_file_name,0777);
} else {
  echo '缓存文件'.$cache_dir.$cache_file_name.'创建失败!
';
}
} else {
die('缓存名称'.$cachename.'不在系统允许的范围内!');
}
}
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);
}
class_recache()函数从数据库取出数据,然后构造一个数组,以分类ID作为数组的索引,类别的信息作为对应的值,方便数据的访问。
缓存的引入:
所有缓存数据统一在include目录下的common.inc.php引入,代码如下:
//加载系统设置信息,文件不存在则重建缓存
if ([email=!@include(JBLOG_ROOT.]!@include(JBLOG_ROOT.'cache_data/cache_config.php'[/email])) {
require_once(JBLOG_ROOT.'include/cache.func.php');
recache('config');
exit('成功创建系统配置信息缓存,请刷新页面!');
}
//加载缓存,缓存文件不存在则重建缓存
$cachestr = '';
$cachelist = array('class','archive','newcomment','newpost','link','tag','statistic','topblog');
foreach ($cachelist as $cachename) {
$cachestr .= (@include(JBLOG_ROOT.'cache_data/cache_'.$cachename.'.php')) ? '' : $cachename.',';
}
$cachestr = substr($cachestr,0,strrpos($cachestr,','));
if ($cachestr) {
require_once(JBLOG_ROOT.'include/cache.func.php');
recache($cachestr);
exit('所有缓存重建完成,请刷新页面!');
}
unset($cachelist,$cachename,$cachestr);
先加载配置信息是因为,在创建其它缓存文件的时候,经常要用到系统的设置信息,如系统设置中有一个选项可以让用户自定义最新日志的数量,在缓存最新日志的时候就会用到该变量,所以必须先确保配置信息成功缓存后,再缓存其它项目。
希望本文所述对大家的php程序设计有所帮助。
            
            
您可能感兴趣的文章:
  • php定时删除文件夹下文件(清理缓存文件)
  • ThinkPHP文件缓存类代码分享
  • PHP 9 大缓存技术总结
  • PHP使用redis实现统计缓存mysql压力的方法
  • yii权限控制的方法(三种方法)
  • YiiFramework入门知识点总结(图文教程)
  • Yii快速入门经典教程
  • Yii使用技巧大汇总
  • yii,CI,yaf框架+smarty模板使用方法
  • Yii清理缓存的方法
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端