首页
站长论坛BBS
救助
投稿
discuz视频教程
discuz技术支持
版块
登录
快速注册

class_core.php文件中核心高效缓存类discuz_memory分析

ARCHY 2015-6-14 [Discuz开发] 来自PC 复制链接
14735
discuz使用视频教程
31idc

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
discuz X3/source/class/class_core.php文件中核心高效缓存类discuz_memory分析

  1. <?php
  2. /**
  3. * Discuz 内存读写引擎
  4. * 支持 memcache, eAccelerator, XCache
  5. *
  6. * 使用的时候建议直接利用函数 memory()
  7. */
  8. class discuz_memory
  9. {
  10.         var $config;
  11.         var $extension = array();
  12.         var $memory;
  13.         var $prefix;
  14.         var $type;
  15.         var $keys;
  16.         var $enable = false;

  17.         /**
  18.          * 确认当前系统支持的内存读写接口
  19.          * @return discuz_memory
  20.          */
  21.         function discuz_memory() {//支持多种类型的缓存
  22.                 $this->extension['eaccelerator'] = function_exists('eaccelerator_get');
  23.                 $this->extension['apc'] = function_exists('apc_fetch');
  24.                 $this->extension['xcache'] = function_exists('xcache_get');
  25.                 $this->extension['memcache'] = extension_loaded('memcache');
  26.         }

  27.         /**
  28.          * 依据config当中设置,初始化内存引擎
  29.          * @param unknown_type $config
  30.          */
  31.         function init($config) {

  32.                 $this->config = $config;
  33.                 $this->prefix = empty($config['prefix']) ? substr(md5($_SERVER['HTTP_HOST']), 0, 6).'_' : $config['prefix'];
  34.                 $this->keys = array();

  35.                 if($this->extension['memcache'] && !empty($config['memcache']['server'])) {
  36.                         require_once libfile('class/memcache');
  37.                         $this->memory = new discuz_memcache();
  38.                         $this->memory->init($this->config['memcache']);
  39.                         if(!$this->memory->enable) {
  40.                                 $this->memory = null;
  41.                         }
  42.                 }

  43.                 if(!is_object($this->memory) && $this->extension['eaccelerator'] && $this->config['eaccelerator']) {
  44.                         require_once libfile('class/eaccelerator');
  45.                         $this->memory = new discuz_eaccelerator();
  46.                         $this->memory->init(null);
  47.                 }

  48.                 if(!is_object($this->memory) && $this->extension['xcache'] && $this->config['xcache']) {
  49.                         require_once libfile('class/xcache');
  50.                         $this->memory = new discuz_xcache();
  51.                         $this->memory->init(null);
  52.                 }

  53.                 if(!is_object($this->memory) && $this->extension['apc'] && $this->config['apc']) {
  54.                         require_once libfile('class/apc');
  55.                         $this->memory = new discuz_apc();
  56.                         $this->memory->init(null);
  57.                 }

  58.                 if(is_object($this->memory)) {
  59.                         $this->enable = true;
  60.                         $this->type = str_replace('discuz_', '', get_class($this->memory));
  61.                         $this->keys = $this->get('memory_system_keys');
  62.                         $this->keys = !is_array($this->keys) ? array() : $this->keys;
  63.                 }

  64.         }

  65.         /**
  66.          * 读取内存
  67.          *
  68.          * @param string $key
  69.          * @return mix
  70.          */
  71.         function get($key) {
  72.                 $ret = null;
  73.                 if($this->enable) {
  74.                         $ret = $this->memory->get($this->_key($key));
  75.                         if(!is_array($ret)) {
  76.                                 $ret = null;
  77.                                 if(array_key_exists($key, $this->keys)) {
  78.                                         unset($this->keys[$key]);
  79.                                         $this->memory->set($this->_key('memory_system_keys'), array($this->keys));
  80.                                 }
  81.                         } else {
  82.                                 return $ret[0];
  83.                         }
  84.                 }
  85.                 return $ret;
  86.         }

  87.         /**
  88.          * 写入内存
  89.          *
  90.          * @param string $key
  91.          * @param array_string_number $value
  92.          * @param int过期时间 $ttl
  93.          * @return boolean
  94.          */
  95.         function set($key, $value, $ttl = 0) {

  96.                 $ret = null;
  97.                 if($this->enable) {
  98.                         $ret = $this->memory->set($this->_key($key), array($value), $ttl);
  99.                         if($ret) {
  100.                                 $this->keys[$key] = true;
  101.                                 $this->memory->set($this->_key('memory_system_keys'), array($this->keys));
  102.                         }
  103.                 }
  104.                 return $ret;
  105.         }

  106.         /**
  107.          * 删除一个内存单元
  108.          * @param 键值string $key
  109.          * @return boolean
  110.          */
  111.         function rm($key) {
  112.                 $ret = null;
  113.                 if($this->enable) {
  114.                         $ret = $this->memory->rm($this->_key($key));
  115.                         unset($this->keys[$key]);
  116.                         $this->memory->set($this->_key('memory_system_keys'), array($this->keys));
  117.                 }
  118.                 return $ret;
  119.         }

  120.         /**
  121.          * 清除当前使用的所有内存
  122.          */
  123.         function clear() {
  124.                 if($this->enable && is_array($this->keys)) {
  125.                         if(method_exists($this->memory, 'clear')) {
  126.                                 $this->memory->clear();
  127.                         } else {
  128.                                 $this->keys['memory_system_keys'] = true;
  129.                                 foreach ($this->keys as $k => $v) {
  130.                                         $this->memory->rm($this->_key($k));
  131.                                 }
  132.                         }
  133.                 }
  134.                 $this->keys = array();
  135.                 return true;
  136.         }

  137.         /**
  138.          * 内部函数 追加键值前缀
  139.          * @param string $str
  140.          * @return boolean
  141.          */
  142.         function _key($str) {
  143.                 return ($this->prefix).$str;
  144.         }

  145. }
  146. ?>
复制代码


更多Discuz二次开发相关源码分析
1、discuz核心类库class_core的函数注释
http://bbs.zb7.com/thread-514094-1-1.html
2、Discuz的forum_index.php文件的分析
http://bbs.zb7.com/thread-517467-1-1.html
3、discuz x3 与通知表有关的程序源代码分析
http://bbs.zb7.com/thread-517471-1-1.html
4、discuz x3 space_notice.php分析注释
http://bbs.zb7.com/thread-517472-1-1.html
5、discuz x3 uc_client/client.php接口文件分析
http://bbs.zb7.com/thread-517473-1-1.html
6、Discuz中session机制流程图
http://bbs.zb7.com/thread-517443-1-1.html
7、class_core.php文件中核心基础类库中discuz_core类分析
http://bbs.zb7.com/thread-517538-1-1.html
8、class_core.php文件中数据库操作类DB及db_mysql分析
http://bbs.zb7.com/thread-517539-1-1.html
9、class_core.php文件中session会话类discuz_session分析
http://bbs.zb7.com/thread-517540-1-1.html





上一篇:class_core.php文件中session会话类discuz_session分析
下一篇:function_delete.php数据清理函数集合分析
UC955 发表于 2015-7-1 17:32:42 来自PC
很给力,希望分享更多给力的帖子啊。
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

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