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 相关文章推荐
php自定义函数call_user_func和call_user_func_array详解
Jul 14 PHP
一个简单且很好用的php分页类
Oct 26 PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 PHP
php防止站外远程提交表单的方法
Oct 20 PHP
php获取网页里所有图片并存入数组的方法
Apr 06 PHP
php获取远程文件内容的函数
Nov 02 PHP
thinkPHP中验证码的简单使用方法
Dec 26 PHP
PHP 表单提交及处理表单数据详解及实例
Dec 27 PHP
PHP多进程编程之僵尸进程问题的理解
Oct 15 PHP
PHP基于redis计数器类定义与用法示例
Feb 08 PHP
PHP Laravel中的Trait使用方法
Jan 20 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 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
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
Thinkphp5 自定义上传文件名的实现方法
2019/07/23 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
js+css在交互上的应用
2010/07/18 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
javascript实现滑动解锁功能
2017/03/22 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
python爬虫常用的模块分析
2014/08/29 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
python 读取txt,json和hdf5文件的实例
2018/06/05 Python
基于python实现聊天室程序
2018/07/27 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
2020/02/29 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
美国手机支架公司:PopSockets
2019/11/27 全球购物
德国婴儿服装和婴儿用品购买网站:Baby Sweets
2019/12/08 全球购物
最新党员的自我评价分享
2013/11/04 职场文书
水污染治理工程专业自荐信
2014/06/21 职场文书
学习雷锋主题班会
2015/08/14 职场文书
四年级作文之植物
2019/09/20 职场文书
Java 多线程协作作业之信号同步
2022/05/11 Java/Android