微擎开发之缓存

微擎开发之缓存

cache_load

function cache_load($key, $unserialize = false) {
	global $_W;
	if (!empty($_W['cache'][$key])) {
		return $_W['cache'][$key];
	}
	$data = $_W['cache'][$key] = cache_read($key);
	//下面的cache_read()
	if ($key == 'setting') {
		$_W['setting'] = $data;
		return $_W['setting'];
	} elseif ($key == 'modules') {
		$_W['modules'] = $data;
		return $_W['modules'];
	} elseif ($key == 'module_receive_enable' && empty($data)) {
				cache_build_module_subscribe_type();
		return cache_read($key);
	} else {
		return $unserialize ? ($data) : $data;
	}
}

cache_read()

function cache_read($key) {
	$sql = 'SELECT `value` FROM ' . tablename('core_cache') . ' WHERE `key`=:key';
	$params = array();
	$params[':key'] = $key;
	$val = pdo_fetchcolumn($sql, $params);
	return iunserializer($val);
}

iunserializer()

获取序列化字符的反序列化结果

示例

print_r(iunserializer('a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;}'));
 
Array
(
	[0] => 1
	[1] => 2
	[2] => 3
	[3] => 4
	[4] => 5
)

函数源码

function iunserializer($value) {
	if (empty($value)) {
		return '';
	}
	//判断是否为序列化字符串
	//不是就返回值
	if (!is_serialized($value)) {
		return $value;
	}
	
	//unserialize — 从已存储的表示中创建 PHP 的值
	//unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。
	$result = unserialize($value);
	
	//返回值
	//返回的是转换之后的值,可为 integer、float、string、array 或 object。
	//如果传递的字符串不可解序列化,则返回 FALSE,并产生一个 E_NOTICE。
	if ($result === false) {
	
		//preg_replace — 执行一个正则表达式的搜索和替换
		$temp = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $value);
		return unserialize($temp);
	}
	return $result;
}
return $unserialize ? iunserializer($data) : $data;