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
PHP4中实现动态代理
Oct 09 PHP
php简单提示框alert封装函数
Aug 08 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
Jan 12 PHP
PHP对象Object的概念 介绍
Jun 14 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
Jun 01 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
Jun 25 PHP
php仿QQ验证码的实例分析
Jul 01 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
Jun 19 PHP
解决cPanel无法安装php5.2.17
Jun 22 PHP
PHP下载文件的函数实例代码
May 18 PHP
Yii2中关联查询简单用法示例
Aug 10 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中一个完整表单处理实现代码
2011/11/10 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
win平台安装配置Nginx+php+mysql 环境
2016/01/12 PHP
PHP培训要多少钱
2017/06/06 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
DOM 基本方法
2009/07/18 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
JS给超链接加确认对话框的方法
2015/02/24 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
2019/01/24 Javascript
浅谈Node 异步IO和事件循环
2019/05/05 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
2019/10/24 Javascript
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
Python实现截屏的函数
2015/07/25 Python
Python中%r和%s的详解及区别
2017/03/16 Python
PyQt5 QSerialPort子线程操作的实现
2018/04/21 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
python 模拟登陆github的示例
2020/12/04 Python
美国购物网站:Clickhere2shop
2021/01/28 全球购物
营业员个人总结的自我评价
2013/10/25 职场文书
厂区绿化方案
2014/05/08 职场文书
2014年协会工作总结
2014/11/22 职场文书
搞笑婚庆主持词
2015/06/29 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
六年级上册《闻官军收河南河北》的教学设计
2019/11/15 职场文书
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL