public function get($name, &$succeeded = null)
{
$name = $this->tag . $name;
$res = $this->impl->get($name, $succeeded);
if ($succeeded) {
$succeeded = false;
list($data, $ttl, $checker, $create_time) = $res;
// 如果指定了checker, ttl代表每次检查的间隔时间, 0表示每次get都需要经过checker检查
// 如果没有指定checker, ttl表示缓存过期时间, 为0表示永不过期
if ($checker !== null) {
if ($ttl == 0 || $create_time + $ttl < time()) {
$valid = false;
try {
if (is_callable($checker)) {
$valid = $checker($data, $create_time);
}
} catch (\Exception $e) {
Logger::warning('call checker failed with ' . $e->getTraceAsString());
$valid = false;
}
if (!$valid) {
Logger::debug("cache {$name} expired by checker");
$this->impl->del($name);
return null;
}
}
} else {
if ($ttl != 0 && $create_time + $ttl < time()) {
Logger::debug("cache {$name} expired by ttl");
$this->impl->del($name);
return null;
}
}
Logger::debug("get {$name} from cache, ttl={$ttl}, create_time={$create_time}, check=" . ($checker === null ? 'null' : get_class($checker)));
$succeeded = true;
return $data;
}
return null;
}