87 lines
3.4 KiB
PHP
87 lines
3.4 KiB
PHP
<?php
|
|
|
|
/**
|
|
* AVE.cms
|
|
*
|
|
* @package AVE.cms
|
|
* @version 4.x (PHP 8+ compatible)
|
|
* @filesource
|
|
* @copyright © 2007-2025 AVE.cms, https://www.ave.gitget.ru
|
|
*
|
|
* @license GPL v.2
|
|
*/
|
|
|
|
// ИСПРАВЛЕНИЕ #1: Добавлено implements SessionHandlerInterface для совместимости с PHP 8+
|
|
class AVE_Session_Memcached implements SessionHandlerInterface
|
|
{
|
|
private Memcached $memcached;
|
|
private int $ttl;
|
|
private string $prefix;
|
|
|
|
function __construct()
|
|
{
|
|
// Добавим проверку на существование констант, чтобы избежать ошибок.
|
|
if (!defined('MEMCACHED_SERVER') || !defined('MEMCACHED_PORT')) {
|
|
// В реальной CMS здесь должна быть обработка ошибки, но для примера просто выйдем.
|
|
throw new Exception('Memcached configuration constants are missing.');
|
|
}
|
|
|
|
$this->memcached = new Memcached;
|
|
$this->memcached->addServer(MEMCACHED_SERVER, MEMCACHED_PORT);
|
|
|
|
$this->ttl = (defined('SESSION_LIFETIME') && is_numeric(SESSION_LIFETIME))
|
|
? (int)SESSION_LIFETIME
|
|
: (get_cfg_var("session.gc_maxlifetime") < 1440 ? 1440 : (int)get_cfg_var("session.gc_maxlifetime"));
|
|
|
|
$this->prefix = 'sess_';
|
|
}
|
|
|
|
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' и добавлены типы
|
|
public function open(string $path, string $name): bool
|
|
{
|
|
return true;
|
|
}
|
|
|
|
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' и добавлены типы
|
|
public function close(): bool
|
|
{
|
|
return true;
|
|
}
|
|
|
|
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' и добавлены типы
|
|
public function read(string $id): string
|
|
{
|
|
// Memcached::get возвращает false при промахе, поэтому используем ?: ''
|
|
// для соответствия требованию read() всегда возвращать строку (string)
|
|
$data = $this->memcached->get($this->prefix . $id);
|
|
return $data !== false ? $data : '';
|
|
}
|
|
|
|
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' и добавлены типы
|
|
public function write (string $id, string $data): bool
|
|
{
|
|
// Время жизни (TTL) передается в виде абсолютной UNIX метки времени
|
|
// или в секундах, если оно меньше 30 дней.
|
|
return $this->memcached->set($this->prefix . $id, $data, time() + $this->ttl);
|
|
}
|
|
|
|
// ИСПРАВЛЕНИЕ #2: Убран префикс '_' и добавлены типы
|
|
public function destroy (string $id): bool
|
|
{
|
|
// delete() возвращает true/false/int
|
|
$result = $this->memcached->delete($this->prefix . $id);
|
|
|
|
// Возвращаем булево значение (true, если запись была удалена или отсутствовала,
|
|
// но не было критической ошибки)
|
|
return $result !== false;
|
|
}
|
|
|
|
// ИСПРАВЛЕНИЕ #2 и #3: Убран префикс '_' и изменен возвращаемый тип на int|false
|
|
public function gc (int $maxlifetime): int|false
|
|
{
|
|
// Memcached автоматически управляет очисткой на основе TTL.
|
|
// Мы просто возвращаем 0 удаленных записей, чтобы соответствовать интерфейсу.
|
|
return 0;
|
|
}
|
|
}
|
|
?>
|