diff --git a/middleware/DbSessionHandler.php b/middleware/DbSessionHandler.php new file mode 100644 index 0000000..08d028e --- /dev/null +++ b/middleware/DbSessionHandler.php @@ -0,0 +1,38 @@ +prepare("SELECT data FROM sessions WHERE id = ? AND updated_at > DATE_SUB(NOW(), INTERVAL " . self::TTL . " SECOND)"); + $stmt->execute([$id]); + $row = $stmt->fetch(); + return $row ? $row['data'] : ''; + } + + public function write(string $id, string $data): bool + { + db()->prepare("INSERT INTO sessions (id, data) VALUES (?, ?) ON DUPLICATE KEY UPDATE data = VALUES(data), updated_at = NOW()") + ->execute([$id, $data]); + return true; + } + + public function destroy(string $id): bool + { + db()->prepare("DELETE FROM sessions WHERE id = ?")->execute([$id]); + return true; + } + + public function gc(int $max_lifetime): int|false + { + $stmt = db()->prepare("DELETE FROM sessions WHERE updated_at < DATE_SUB(NOW(), INTERVAL ? SECOND)"); + $stmt->execute([self::TTL]); + return $stmt->rowCount(); + } +} diff --git a/middleware/SessionAuth.php b/middleware/SessionAuth.php index bc0d036..1c591bc 100644 --- a/middleware/SessionAuth.php +++ b/middleware/SessionAuth.php @@ -1,13 +1,16 @@ 0, + 'lifetime' => 86400 * 30, // 30 days — survives deploys 'path' => '/', 'secure' => isset($_SERVER['HTTPS']), 'httponly' => true,