/**
* Discuz 内存读写引擎
* 支持 memcache, eAccelerator, XCache
*
* 使用的时候建议直接利用函数 memory()
*/
class discuz_memory
{
var $config;
var $extension = array();
var $memory;
var $prefix;
var $type;
var $keys;
var $enable = false;
/**
* 确认当前系统支持的内存读写接口
* @return discuz_memory
*/
function discuz_memory() {//支持多种类型的缓存
$this->extension['eaccelerator'] = function_exists('eaccelerator_get');
$this->extension['apc'] = function_exists('apc_fetch');
$this->extension['xcache'] = function_exists('xcache_get');
$this->extension['memcache'] = extension_loaded('memcache');
}
/**
* 依据config当中设置,初始化内存引擎
* @param unknown_type $config
*/
function init($config) {
$this->config = $config;
$this->prefix = empty($config['prefix']) ? substr(md5($_SERVER['HTTP_HOST']), 0, 6).'_' : $config['prefix'];
$this->keys = array();
if($this->extension['memcache'] && !empty($config['memcache']['server'])) {
require_once libfile('class/memcache');
$this->memory = new discuz_memcache();
$this->memory->init($this->config['memcache']);
if(!$this->memory->enable) {
$this->memory = null;
}
}
if(!is_object($this->memory) && $this->extension['eaccelerator'] && $this->config['eaccelerator']) {
require_once libfile('class/eaccelerator');
$this->memory = new discuz_eaccelerator();
$this->memory->init(null);
}
if(!is_object($this->memory) && $this->extension['xcache'] && $this->config['xcache']) {
require_once libfile('class/xcache');
$this->memory = new discuz_xcache();
$this->memory->init(null);
}
if(!is_object($this->memory) && $this->extension['apc'] && $this->config['apc']) {
require_once libfile('class/apc');
$this->memory = new discuz_apc();
$this->memory->init(null);
}
if(is_object($this->memory)) {
$this->enable = true;
$this->type = str_replace('discuz_', '', get_class($this->memory));
$this->keys = $this->get('memory_system_keys');
$this->keys = !is_array($this->keys) ? array() : $this->keys;
}
}
/**
* 读取内存
*
* @param string $key
* @return mix
*/
function get($key) {
$ret = null;
if($this->enable) {
$ret = $this->memory->get($this->_key($key));
if(!is_array($ret)) {
$ret = null;
if(array_key_exists($key, $this->keys)) {
unset($this->keys[$key]);
$this->memory->set($this->_key('memory_system_keys'), array($this->keys));
}
} else {
return $ret[0];
}
}
return $ret;
}
/**
* 写入内存
*
* @param string $key
* @param array_string_number $value
* @param int过期时间 $ttl
* @return boolean
*/
function set($key, $value, $ttl = 0) {
$ret = null;
if($this->enable) {
$ret = $this->memory->set($this->_key($key), array($value), $ttl);
if($ret) {
$this->keys[$key] = true;
$this->memory->set($this->_key('memory_system_keys'), array($this->keys));
}
}
return $ret;
}
/**
* 删除一个内存单元
* @param 键值string $key
* @return boolean
*/
function rm($key) {
$ret = null;
if($this->enable) {
$ret = $this->memory->rm($this->_key($key));
unset($this->keys[$key]);
$this->memory->set($this->_key('memory_system_keys'), array($this->keys));
}
return $ret;
}
/**
* 清除当前使用的所有内存
*/
function clear() {
if($this->enable && is_array($this->keys)) {
if(method_exists($this->memory, 'clear')) {
$this->memory->clear();
} else {
$this->keys['memory_system_keys'] = true;
foreach ($this->keys as $k => $v) {
$this->memory->rm($this->_key($k));
}
}
}
$this->keys = array();
return true;
}
/**
* 内部函数 追加键值前缀
* @param string $str
* @return boolean
*/
function _key($str) {
return ($this->prefix).$str;
}
}
?>