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脚本数据库功能详解(上)
Oct 09 PHP
PHP将XML转数组过程详解
Nov 13 PHP
浅谈PHP调用Webservice思路及源码分享
Jun 04 PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 PHP
PHP判断浏览器、判断语言代码分享
Mar 05 PHP
经典PHP加密解密函数Authcode()修复版代码
Apr 05 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
学习php设计模式 php实现单例模式(singleton)
Dec 07 PHP
php实现微信企业号支付个人的方法详解
Jul 26 PHP
php源码的安装方法和实例
Sep 26 PHP
Laravel 之url参数,获取路由参数的例子
Oct 21 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
PHP extract 将数组拆分成多个变量的函数
2010/06/30 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
javascript Prototype 对象扩展
2009/05/15 Javascript
jquery 分页控件实现代码
2009/11/30 Javascript
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
JS清除IE浏览器缓存的方法
2013/07/26 Javascript
浅析JavaScript中的CSS属性及命名规范
2013/11/28 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
js中的触发事件对象event.srcElement与event.target详解
2017/03/15 Javascript
利用angular、react和vue实现相同的面试题组件
2018/02/19 Javascript
如何以Angular的姿势打开Font-Awesome详解
2018/04/22 Javascript
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
vue实现登录功能
2020/12/31 Vue.js
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
django列表筛选功能的实现代码
2020/03/27 Python
设计师珠宝:Ylang 23
2018/05/11 全球购物
中软Java笔试题
2012/11/11 面试题
经贸日语专业个人求职信
2013/12/13 职场文书
酒店司机岗位职责
2013/12/14 职场文书
王老吉广告词
2014/03/20 职场文书
2015学校师德师风工作总结
2015/04/22 职场文书
实习感想范文
2015/08/10 职场文书
2016年国庆节宣传标语
2015/11/25 职场文书
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python
nginx lua 操作 mysql
2022/05/15 Servers
js基于div丝滑实现贝塞尔曲线
2022/09/23 Javascript