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调用三种数据库的方法(1)
Oct 09 PHP
PHP文本操作类
Nov 25 PHP
提升PHP性能的21种方法介绍
Jun 25 PHP
PHP批量上传图片的具体实现方法介绍.
Feb 26 PHP
php实现文件下载简单示例(代码实现文件下载)
Mar 10 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
Aug 20 PHP
php+mysqli事务控制实现银行转账实例
Jan 29 PHP
PHP中常见的缓存技术实例分析
Sep 23 PHP
php搜索文件程序分享
Oct 30 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 PHP
Smarty模板引擎缓存机制详解
May 23 PHP
PHP实现微信红包金额拆分试玩的算法示例
Apr 07 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垃圾代码优化操作代码
2010/08/05 PHP
php批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
php中static 静态变量和普通变量的区别
2016/12/01 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
javascript 类方法定义还是有点区别
2009/04/15 Javascript
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
js中eval详解
2012/03/30 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
Bootstrap表格制作代码
2017/03/17 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
vue-loader教程介绍
2017/06/14 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
python动态参数用法实例分析
2015/05/25 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
Python PIL库图片灰化处理
2020/04/07 Python
Python实现石头剪刀布游戏
2021/01/20 Python
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
车间主任岗位职责
2014/03/16 职场文书
承诺书范本大全
2015/05/04 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
python实现简单石头剪刀布游戏
2021/10/24 Python
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL