pdo = new \PDO('sqlite:' . $path); $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $this->pdo->exec("\n\t\t\tPRAGMA foreign_keys = ON;\n\t\t\tCREATE TABLE IF NOT EXISTS cache (\n\t\t\t\tkey BLOB NOT NULL PRIMARY KEY,\n\t\t\t\tdata BLOB NOT NULL,\n\t\t\t\texpire INTEGER,\n\t\t\t\tslide INTEGER\n\t\t\t);\n\t\t\tCREATE TABLE IF NOT EXISTS tags (\n\t\t\t\tkey BLOB NOT NULL REFERENCES cache ON DELETE CASCADE,\n\t\t\t\ttag BLOB NOT NULL\n\t\t\t);\n\t\t\tCREATE INDEX IF NOT EXISTS cache_expire ON cache(expire);\n\t\t\tCREATE INDEX IF NOT EXISTS tags_key ON tags(key);\n\t\t\tCREATE INDEX IF NOT EXISTS tags_tag ON tags(tag);\n\t\t\tPRAGMA synchronous = OFF;\n\t\t"); } public function read(string $key): mixed { $stmt = $this->pdo->prepare('SELECT data, slide FROM cache WHERE key=? AND (expire IS NULL OR expire >= ?)'); $stmt->execute([$key, time()]); if (!$row = $stmt->fetch(\PDO::FETCH_ASSOC)) { return null; } if ($row['slide'] !== null) { $this->pdo->prepare('UPDATE cache SET expire = ? + slide WHERE key=?')->execute([time(), $key]); } return unserialize($row['data']); } public function bulkRead(array $keys): array { $stmt = $this->pdo->prepare('SELECT key, data, slide FROM cache WHERE key IN (?' . str_repeat(',?', count($keys) - 1) . ') AND (expire IS NULL OR expire >= ?)'); $stmt->execute(array_merge($keys, [time()])); $result = []; $updateSlide = []; foreach ($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) { if ($row['slide'] !== null) { $updateSlide[] = $row['key']; } $result[$row['key']] = unserialize($row['data']); } if (!empty($updateSlide)) { $stmt = $this->pdo->prepare('UPDATE cache SET expire = ? + slide WHERE key IN(?' . str_repeat(',?', count($updateSlide) - 1) . ')'); $stmt->execute(array_merge([time()], $updateSlide)); } return $result; } public function lock(string $key): void { } public function write(string $key, $data, array $dependencies): void { $expire = isset($dependencies[Cache::Expire]) ? $dependencies[Cache::Expire] + time() : null; $slide = isset($dependencies[Cache::Sliding]) ? $dependencies[Cache::Expire] : null; $this->pdo->exec('BEGIN TRANSACTION'); $this->pdo->prepare('REPLACE INTO cache (key, data, expire, slide) VALUES (?, ?, ?, ?)') ->execute([$key, serialize($data), $expire, $slide]); if (!empty($dependencies[Cache::Tags])) { foreach ($dependencies[Cache::Tags] as $tag) { $arr[] = $key; $arr[] = $tag; } $this->pdo->prepare('INSERT INTO tags (key, tag) SELECT ?, ?' . str_repeat('UNION SELECT ?, ?', count($arr) / 2 - 1)) ->execute($arr); } $this->pdo->exec('COMMIT'); } public function remove(string $key): void { $this->pdo->prepare('DELETE FROM cache WHERE key=?') ->execute([$key]); } public function clean(array $conditions): void { if (!empty($conditions[Cache::All])) { $this->pdo->prepare('DELETE FROM cache')->execute(); } else { $sql = 'DELETE FROM cache WHERE expire < ?'; $args = [time()]; if (!empty($conditions[Cache::Tags])) { $tags = $conditions[Cache::Tags]; $sql .= ' OR key IN (SELECT key FROM tags WHERE tag IN (?' . str_repeat(',?', count($tags) - 1) . '))'; $args = array_merge($args, $tags); } $this->pdo->prepare($sql)->execute($args); } } } __halt_compiler();----SIGNATURE:----rczT+oTLltygt2MRWwywIRypaqBpVRgEdPpD67y5/ClyOFw72qC5KY5a3k5l54kwZPk19ScDucpLQF1AfvW6aUukE92ZBq0tbR5chooQDaCYk8ATt5Fhnb9dIzjWFOrHx3Fb2imXSeesXbGm3B0WWg8fywvu8kyJCR0KYXzUjOxEnvDy6c1+JzBJw80fGeQwvgqaaDWr8s0qPG6XyQZ/MK75v6sfMGesPk1ESBUVafb5IZpZ3m0PeQjyoh25On6jzK8ZDxPhbZAJGfI4kBIFwDgg8zfCdq+zZxi/5zdCRj0NTEunRnj1+LR1V7/94VRjVTPFGBVjAtFIvQl/w4ZVo5WPa/7HXMNDv9VD4XulNsjZbA0gIeI9lQhnxYIvuu8EhWEzG87eHBytVqu4rMK6VXS3r+6JjMQdcudxEeWV4WeFD0l+ZsccnyOpFveMwlhbAJIwWhYsU4NVAriM7ZUuzw4I1h/QcC0tSmuk+zrevpFooSPROYB1QduVuEKzF+zRLIcOw+RGMe0ZF3kUq8UvQ0NLTTthQi4YcjK19R1UJmh/Y8LztWs4qWVUd/Yb5CWN+Ee/Cfov3/d+/f0yEziZXm+T2xj/4+CF0GIhNKxibbwg59qjm+MBr25koZUV9ystHcs4SFQzXgRbwZjYcskig9XZd7nKNMZfwrY9R6p5mn4=----ATTACHMENT:----MjIyNTI4MjQ3MDkxNzc3NSA1OTY1NDUwMjU2NzE5OTgyIDIwMDI3Nzk0ODQ1NzU2MzI=