zoukankan      html  css  js  c++  java
  • php -- php缓存技术

    为了尽量减少不必要的数据库查询,我对一些数据进行了缓存和静态化处理。

    缓存的原理:把一些经常要用到但又很少改动的数据以数组或其它形式存储到一个独立的PHP文件中,然后在需要用到的时候包含进来。

    缓存的优点:能够大大减少数据库的查询次数,减轻数据库的压力,提高程序的执行效率。

    缓存的数据有:系统设置、博客分类、侧栏最新日志、最新评论、博客统计、日志归档、友情链接、标签等。通过缓存这些数据,执行一次页面数据库的查询次数从十几次减少到3次。

    与缓存相关的函数保存在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
    //该文件是系统自动生成的缓存文件,请勿修改
    //创建时间:".date('Y-m-d H:i:s',time())."
    
    if (!defined('IN_JBLOG')) {exit('Access Denied!');}
    
    ".$content."
    
    ?>";
       @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 .= "	array(
    ";
      $content .= "	'id'=>'".addslashes($row['id'])."',
    ";
      $content .= "	'classname'=>'".addslashes($row['classname'])."',
    ";
      $content .= "	'description'=>'".addslashes($row['description'])."',
    ";
      $content .= "	'orderid'=>'".addslashes($row['orderid'])."',
    ";
      $content .= "	'arcnum'=>'".addslashes($row['arcnum'])."',
    ";
      $content .= "	),
    ";
    }
    $content = substr($content,0,strrpos($content,','));
    $content = "$class_cache = array(
    {$content}
    );";
    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);

    先加载配置信息是因为,在创建其它缓存文件的时候,经常要用到系统的设置信息,如系统设置中有一个选项可以让用户自定义最新日志的数量,在缓存最新日志的时候就会用到该变量,所以

    必须先确保配置信息成功缓存后,再缓存其它项目

  • 相关阅读:
    【硬件设备】海康NVR硬盘录像机接入海康RTSP摄像头操作步骤
    互联网直播服务中域名与IP有什么关系?TSINGSEE青犀视频全线产品的应用全解
    H.265编码视频播放器EasyPlayerPro for Windows使用FFMPEG编码过程说明
    RTSP/GB28181/HIKSDK/Ehome协议视频平台EasyCVR如何通过ffmpeg 将 H.264 I帧数据转换为 BGR 数据?
    如何轻松搞定内网摄像头远程运维?EasyNTS上云网关简单三步实现设备公网远程控制、远程配置
    RTSP/GB28181/HIKSDK/Ehome协议视频平台EasyCVR使用OpenCV 从内存中构建 Mat 数据说明
    视频上云服务平台EasyCVR使用Go语言可执行程序出现“Process XXX has exited with status XXXX”错误
    视频智能分析/视频上云服务平台EasyCVR通过GB28181级联后RTSP协议视频流无法播放问题排查
    网络摄像头无插件直播H265编码视频播放器EasyPlayer网页播放器不能播放怎么处理?
    JSP中session对象的理解
  • 原文地址:https://www.cnblogs.com/hf8051/p/4586508.html
Copyright © 2011-2022 走看看