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;
|
||
}
|
||
}
|
||
?>
|