driver = $driver ?? Cache::store($this->defaultStore()); } /** * 默认 think 缓存 store 名(子类覆写). */ protected function defaultStore(): string { return 'file'; } public function get(string $key, mixed $default = null): mixed { return $this->driver->get($key, $default); } public function set(string $key, mixed $value, null|int|\DateInterval $ttl = null): bool { return (bool) $this->driver->set($key, $value, $this->normalizeTtl($ttl)); } public function delete(string $key): bool { return (bool) $this->driver->delete($key); } public function clear(): bool { return (bool) $this->driver->clear(); } public function getMultiple(iterable $keys, mixed $default = null): iterable { $keys = is_array($keys) ? $keys : iterator_to_array($keys, false); $result = []; foreach ($keys as $key) { $result[$key] = $this->driver->get($key, $default); } return $result; } public function setMultiple(iterable $values, null|int|\DateInterval $ttl = null): bool { $ttl = $this->normalizeTtl($ttl); $result = true; foreach ($values as $key => $value) { if (!$this->driver->set((string) $key, $value, $ttl)) { $result = false; } } return $result; } public function deleteMultiple(iterable $keys): bool { $result = true; foreach ($keys as $key) { if (!$this->driver->delete($key)) { $result = false; } } return $result; } public function has(string $key): bool { return (bool) $this->driver->has($key); } /** * PSR-16 TTL 归一为秒:DateInterval 折算秒数;null 视为 0(think 驱动默认有效期,0=永久). */ protected function normalizeTtl(null|int|\DateInterval $ttl): int { if ($ttl instanceof \DateInterval) { $now = new \DateTimeImmutable('@' . time()); return max(0, $now->add($ttl)->getTimestamp() - $now->getTimestamp()); } return max(0, (int) ($ttl ?? 0)); } }