Files
ave-cms-alt/class/class.session.memcached.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;
}
}
?>