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 array数组的教程详解
Jun 05 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
Jun 17 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
Jun 20 PHP
php网站判断用户是否是手机访问的方法
Nov 01 PHP
PHP修改session_id示例代码
Jan 08 PHP
对PHP依赖注入的理解实例分析
Oct 09 PHP
老生常谈PHP中的数据结构:DS扩展
Jul 17 PHP
yii2中关于加密解密的那些事儿
Jun 12 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 PHP
PHP实现数组和对象的相互转换操作示例
Mar 20 PHP
Laravel第三方包报class not found的解决方法
Oct 13 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 cookis创建实现代码
2009/03/16 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
php 使用array函数实现分页
2015/02/13 PHP
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
Python简单实现安全开关文件的两种方式
2016/09/19 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
django中send_mail功能实现详解
2018/02/06 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
Python3中的bytes和str类型详解
2019/05/02 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
让IE支持HTML5的方法
2012/12/11 HTML / CSS
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
行政经理岗位职责
2013/11/09 职场文书
保护环境倡议书300字
2014/05/19 职场文书
银行会计主管岗位职责
2014/10/01 职场文书
商铺租房协议书范本
2014/12/04 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
阿里云Nginx配置https实现域名访问项目(图文教程)
2021/03/31 Servers