微擎开发之cache缓存
微擎开发之缓存
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;