Sobes.tech
Middle

Come fare in modo che le sessioni non vengano salvate nei file?

sobes.tech AI

Risposta dell'AI

Использовать собственный обработчик сессий, реализующий интерфейс SessionHandlerInterface.

  1. Создать класс, реализующий методы интерфейса: open, close, read, write, destroy, gc и create_sid.
  2. Внутри методов реализовать логику сохранения и чтения данных сессии, используя другую базу данных (например, MySQL, PostgreSQL, Redis, Memcached) или другой механизм хранения.
  3. Зарегистрировать этот обработчик с помощью функции session_set_save_handler().

Пример класса для сохранения в Redis:

<?php

class RedisSessionHandler implements SessionHandlerInterface
{
    private $redis;
    private $ttl;

    public function __construct(Redis $redis, int $ttl = 1800)
    {
        $this->redis = $redis;
        $this->ttl = $ttl;
    }

    public function open(string $path, string $name): bool
    {
        // Можно использовать для инициализации, если нужно
        return true;
    }

    public function close(): bool
    {
        // Можно использовать для завершения, если нужно
        return true;
    }

    public function read(string $id): string|false
    {
        $data = $this->redis->get("session:$id");
        return $data === false ? '' : $data; // Возвращаем пустую строку, если нет данных
    }

    public function write(string $id, string $data): bool
    {
        return $this->redis->setex("session:$id", $this->ttl, $data);
    }

    public function destroy(string $id): bool
    {
        return $this->redis->del("session:$id") > 0;
    }

    public function gc(int $max_lifetime): int|false
    {
        // В Redis сборка мусора происходит автоматически по TTL
        return 0;
    }

    public function create_sid(): string
    {
        // Можно использовать стандартную реализацию или генерировать свою
        return bin2hex(random_bytes(16));
    }
}

Регистрация обработчика:

<?php

// Предполагается, что объект Redis уже создан и подключен
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$handler = new RedisSessionHandler($redis);
session_set_save_handler($handler, true); // true - для автоматического закрытия

session_start(); // Начинаем сессию

Другие варианты:

  • Использовать готовую реализацию сессионного обработчика от фреймворка или сторонней библиотеки.
  • Изменить значение директивы session.save_handler в php.ini на нужный обработчик (например, redis или memcached), если модуль соответствующего расширения PHP установлен и настроен.