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


Posted in PHP onSeptember 23, 2015

本文实例分析了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);
}

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 相关文章推荐
用Flash图形化数据(一)
Oct 09 PHP
在PHP中检查PHP文件是否有语法错误的方法
Dec 23 PHP
PHP类中的魔术方法(Magic Method)简明总结
Jul 08 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
Jan 05 PHP
PHP中的数组处理函数实例总结
Jan 09 PHP
php结合redis高并发下发帖、发微博的实现方法
Dec 15 PHP
Laravel学习教程之本地化模块
Aug 18 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 PHP
PHP curl批处理及多请求并发实现方法分析
Aug 15 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
PHP数组array类常见操作示例
May 15 PHP
php7 list()、session及其他模块的修改实例分析
May 25 PHP
PHPStrom中实用的功能和快捷键大全
Sep 23 #PHP
PHP提高编程效率的20个要点
Sep 23 #PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
Sep 23 #PHP
php设置页面超时时间解决方法
Sep 22 #PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
Sep 22 #PHP
PHP判断字符串长度的两种方法很实用
Sep 22 #PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
Sep 22 #PHP
You might like
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
PHP 5.3新特性命名空间规则解析及高级功能
2010/03/11 PHP
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
php中去除所有js,html,css代码
2010/10/12 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
JavaScript伸缩的菜单简单示例
2013/12/03 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
基于Bootstrap仿淘宝分页控件实现代码
2016/11/07 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
Javascript的this详解
2019/03/23 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
JS实现小米轮播图
2020/09/21 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
在Django的视图中使用form对象的方法
2015/07/18 Python
python处理按钮消息的实例详解
2017/07/11 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
python+splinter实现12306网站刷票并自动购票流程
2018/09/25 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
Django 解决由save方法引发的错误
2020/05/21 Python
Python爬虫爬取百度搜索内容代码实例
2020/06/05 Python
Python selenium如何打包静态网页并下载
2020/08/12 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
学雷锋广播稿大全
2015/08/19 职场文书
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android