请选择 进入手机版 | 继续访问电脑版
查看: 151|回复: 0

Discuz缓存设置函数savecache()被调用时执行的所有代码

[复制链接]

648

主题

650

帖子

3342

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3342
发表于 2021-10-18 12:41:37 | 显示全部楼层 |阅读模式
Discuz缓存设置函数savecache()被调用时执行的所有代码
  1. <?php
  2. //cache_heats.php
  3. savecache("heats", $data);

  4. //function_core.php
  5. function savecache($cachename, $data) {
  6.   C::t("common_syscache")->insert($cachename, $data);
  7. }

  8. //文件路径:/source/class/table/table_common_syscache.php
  9. //table_common_syscache类的部分代码
  10. class table_common_syscache extends discuz_table {
  11.   private $_isfilecache;
  12.   public function __construct() {
  13.     $this->_table = "common_syscache";
  14.     $this->_pk = "cname";
  15.     $this->_pre_cache_key = "";
  16.     //比较$_G["config"]["cache"]["type"]当前的值是否等于"file",判断是否为文件缓存机制
  17.     $this->_isfilecache = getglobal("config/cache/type") == "file";
  18.     //检查内存功能是否可用
  19.     $this->_allowmem = memory("check");
  20.     //执行父类discuz_table的构造函数
  21.     parent::__construct();
  22.   }
  23.   public function insert($cachename, $data) {
  24.     //执行父类discuz_table的insert()方法
  25.     parent::insert(array(
  26.       "cname"=>$cachename,//"heats"
  27.       "ctype"=>is_array($data) ? 1 : 0,
  28.       "dateline"=>TIMESTAMP,
  29.       "data"=>is_array($data) ? serialize($data) : $data,
  30.     ), false, true);
  31.     //$this->_allowmem等于File
  32.     if ($this->_allowmem && memory("get", $cachename) !== false) {
  33.       memory("set", $cachename, $data);
  34.       //memory("set", "heats", $data)
  35.     }
  36.     $this->_isfilecache && @unlink(DISCUZ_ROOT."./data/cache/cache_".$cachename.".php");
  37.   }
  38. }

  39. //文件路径:/source/class/discuz/discuz_table.php
  40. //discuz_table类的部分代码
  41. class discuz_table extends discuz_base {
  42.     //公共属性
  43.     public $data = array();
  44.     public $methods = array();
  45.     //受保护的属性
  46.     protected $_table;
  47.     protected $_pk;
  48.     protected $_pre_cache_key;
  49.     protected $_cache_ttl;
  50.     protected $_allowmem;
  51.     //构造函数
  52.     public function __construct($para=array()) {
  53.         if (!empty($para)) {
  54.             $this->_table = $para["table"];
  55.             $this->_pk = $para["pk"];
  56.         }
  57.         if (isset($this->_pre_cache_key) &&
  58.             (($ttl=getglobal("setting/memory".$this->_table)) !== null || ($ttl=$this->_cache_ttl) !== null) &&
  59.             memory("check")
  60.             ) {
  61.             $this->_cache_ttl = $ttl;
  62.             $this->_allowmem = true;
  63.         }
  64.         $this->_init_extend();//方法定义为空
  65.         parent::__construct();//discuz_base类的构造函数为空
  66.     }
  67.     public function insert($data, $return_insert_id=false, $replace=false, $silent=false) {
  68.       return DB::insert($this->_table, $data, $return_insert_id, $replace, $silent);
  69.       //DB::insert(
  70.         //"common_syscache",将数据插入pre_common_syscache数据表
  71.         //array("cname"=>"heats","ctype"=>1,"dateline"=>TIMESTAMP,"data"=>serialize($data)),
  72.         //false,不返回insert_id
  73.         //true执行替换操作
  74.       //);
  75.     }
  76. }

  77. //function_core.php
  78. //memory("get", "heats")
  79. function memory($cmd, $key="", $value="", $ttl=0, $prefix="") {
  80.   if ($cmd == "check") {
  81.     return C::memory()->enable ? C::memory()->type : "";
  82.   } elseif (C::memory()->enable && in_array($cmd, array("set","get","rm","inc","dec"))) {
  83.     //省略部分代码if (defined("DISCUZ_DEBUG") && DISCUZ_DEBUG) {......}
  84.     switch ($cmd) {
  85.       case "set":
  86.         return C::memory()->set($key, $value, $ttl, $prefix);//C::memory()->set("heats", $data, 0, "")
  87.         break;
  88.       case "get":
  89.         return C::memory()->get($key, $value);//C::memory()->get("heats", "")
  90.         break;
  91.       case "rm":
  92.         return C::memory()->rm($key, $value);
  93.         break;
  94.       case "inc":
  95.         return C::memory()->inc($key, $value ? $value : 1);
  96.         break;
  97.       case "dec":
  98.         return C::memory()->dec($key, $value ? $value : -1);
  99.         break;
  100.     }
  101.   }
  102.   return null;
  103. }

  104. //文件路径:/source/class/discuz/discuz_memory.php
  105. //discuz_memory类的部分代码
  106. class discuz_memory extends discuz_base {
  107.   //私有属性
  108.   private $config;
  109.   private $extension = array();
  110.   private $memory;
  111.   private $prefix;
  112.   private $userprefix;
  113.   //公共属性
  114.   public $type;
  115.   public $enable = false;
  116.   public $debug = array();
  117.   //构造函数
  118.   public function __construct() {}
  119.   //初始化
  120.   public function init($config) {
  121.     $this->config = $config;
  122.     $this->prefix = empty($config["prefix"]) ? substr(md5($_SERVER["HTTP_HOST"), 0, 6)."_" : $config["prefix"];
  123.     unset($this->config["prefix"]);
  124.     foreach ($this->config as $cache => $config) {
  125.       $available = is_array($config) ? !empty($config["server"]) : !empty($config);
  126.       if ($available && !is_object($this->memory)) {
  127.         $class_name = "memory_driver_".$cache;
  128.         $this->memory = new $class_name();
  129.         $this->memory->init($config);
  130.         //memory_driver_file
  131.         //$this->memory = new memory_driver_file()
  132.         //$this->memory->init(array(["server"]=>"data/cache/filecache"))
  133.         if (!$this->memory->enable) {
  134.           $this->memory = null;
  135.         } else {
  136.           $this->type = $this->memory->cacheName;//File
  137.           $this->enable = true;
  138.         }
  139.       }
  140.     }
  141.   }
  142.   //C::memory()->get("heats", "")
  143.   public function get($key, $prefix="") {
  144.     static $getmulti = null;
  145.     $ret = false;
  146.     if ($this->enable) {
  147.       //memory_driver_file类不存在getMulti方法(查看文件/source/class/memory/memory_driver_file.php)
  148.       if (!isset($getmulti)) $getmulti = method_exists($this->memory, "getMulti");
  149.       $this->userprefix = $prefix;
  150.       if (is_array($key)) {
  151.         if ($getmulti) {
  152.           //省略部分代码
  153.         } else {
  154.           $ret = array();
  155.           $_ret = false;
  156.           foreach ($key as $id) {
  157.             if (($_ret = $this->memory->get($this->_key($id))) !== false && isset($_ret)) {
  158.               $ret[$id] = $_ret;
  159.             }
  160.           }
  161.         }
  162.         if (empty($ret)) $ret = false;
  163.       } else {
  164.         //$this->_key("heats")返回qUR9F2_heats
  165.         //再执行$this->memory->get("qUR9F2_heats"),转到memory_driver_file类的get()方法
  166.         $ret = $this->memory->get($this->_key($key));
  167.         if (!isset($ret)) $ret = false;
  168.       }
  169.     }
  170.     return $ret;
  171.   }
  172.   private function _key($str) {
  173.     $perfix = $this->prefix.$this->userprefix;
  174.     if (is_array($str)) {
  175.       foreach ($str as &$val) {
  176.         $val = $perfix.$val;
  177.       }
  178.     } else {
  179.       $str = $perfix.$str;
  180.     }
  181.     return $str;
  182.   }
  183.   //C::memory()->set("heats", $data, 0, "")
  184.   public function set($key, $value, $ttl=0, $prefix="") {
  185.     $ret = false;
  186.     if ($value === false) $value = "";
  187.     if ($this->enable) {
  188.       $this->userprefix = $prefix;
  189.       //$this->memory->set("qUR9F2_heats", $data, 0)
  190.       $ret = $this->memory->set($this->_key($key), $value, $ttl);
  191.     }
  192.     return $ret;
  193.   }
  194. }

  195. class memory_driver_file {
  196.   public $cacheName = "File";
  197.   public $enable;
  198.   public $path;
  199.   private function cachefile($key) {
  200.     return str_replace("_", "/", $key)."/".$key;
  201.   }
  202.   public function get($key) {
  203.     //DISCUZ_ROOT = D:\phpStudy\WWW\
  204.     //$this->path等于data/cache/filecache/

  205.     //$this->cachefile("qUR9F2_heats")返回qUR9F2/heats/qUR9F2_heats
  206.     //$file = D:\phpStudy\WWW\data/cache/filecache/qUR9F2/heats/qUR9F2_heats.php
  207.     $file = DISCUZ_ROOT.$this->path.$this->cachefile($key).".php";
  208.     if (!file_exists($file)) {
  209.       return false;
  210.     }
  211.     $data = null;
  212.     @include $file;
  213.     if ($data !== null) {
  214.       if ($data["exp"] && $data["exp"] < TIMESTAMP) {
  215.         return false;
  216.       } else {
  217.         return $data["data"];
  218.       }
  219.     } else {
  220.       return false;
  221.     }
  222.   }
  223.   //$this->memory->set("qUR9F2_heats", $data, 0)
  224.   public function set($key, $value, $ttl=0) {
  225.     //$this->cachefile("qUR9F2_heats")返回qUR9F2/heats/qUR9F2_heats
  226.     //$file = D:\phpStudy\WWW\data/cache/filecache/qUR9F2/heats/qUR9F2_heats.php
  227.     $file = DISCUZ_ROOT.$this->path.$this->cachefile($key).".php";
  228.     dmkdir(dirname($file));
  229.     $data = array(
  230.       "exp" => $ttl ? TIMESTAMP + $ttl : 0,
  231.       "data" => $value,
  232.     );
  233.     file_put_contents($file, "<?php\n\$data = ".var_export($data, 1).";\n");
  234.     return true;
  235.   }
  236. }
  237. ?>
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|蓄财网 ( 豫ICP备2021002293号 )

GMT+8, 2021-11-29 22:14 , Processed in 0.103563 second(s), 32 queries .

蓄财网 ©版权所有

© 2021 蓄财网(www.aixc.cn)

快速回复 返回顶部 返回列表