FlightPHP Сессия - Легковесный файловый обработчик сессий

Это легковесный, файловый плагин обработчика сессий для Flight PHP Framework. Он предоставляет простое, но мощное решение для управления сессиями с такими функциями, как неблокирующее чтение сессий, опциональное шифрование, функция автоматического коммита и тестовый режим для разработки. Данные сессии хранятся в файлах, что делает его идеальным для приложений, которые не требуют базу данных.

Если вы хотите использовать базу данных, ознакомьтесь с плагином ghostff/session, который имеет многие из этих функций, но с базой данных.

Посетите Github репозиторий для полного исходного кода и деталей.

Установка

Установите плагин через Composer:

composer require flightphp/session

Основное использование

Вот простой пример того, как использовать плагин flightphp/session в вашем приложении Flight:

require 'vendor/autoload.php';

use flight\Session;

$app = Flight::app();

// Регистрация сервиса сессии
$app->register('session', Session::class);

// Пример маршрута с использованием сессии
Flight::route('/login', function() {
    $session = Flight::session();
    $session->set('user_id', 123);
    $session->set('username', 'johndoe');
    $session->set('is_admin', false);

    echo $session->get('username'); // Вывод: johndoe
    echo $session->get('preferences', 'default_theme'); // Вывод: default_theme

    if ($session->get('user_id')) {
        Flight::json(['message' => 'Пользователь вошел в систему!', 'user_id' => $session->get('user_id')]);
    }
});

Flight::route('/logout', function() {
    $session = Flight::session();
    $session->clear(); // Очистить все данные сессии
    Flight::json(['message' => 'Успешный выход']);
});

Flight::start();

Ключевые моменты

  • Неблокирующий: По умолчанию использует read_and_close для начала сессии, предотвращая проблемы блокировки сессий.
  • Авто-коммит: Включен по умолчанию, поэтому изменения сохраняются автоматически при завершении работы, если не отключены.
  • Файловое хранилище: Сессии хранятся в системном временном каталоге по умолчанию в /flight_sessions.

Конфигурация

Вы можете настроить обработчик сессий, передавая массив параметров при регистрации:

$app->register('session', Session::class, [
    'save_path' => '/custom/path/to/sessions',         // Каталог для файлов сессий
    'encryption_key' => 'a-secure-32-byte-key-here',   // Включить шифрование (рекомендуется 32 байта для AES-256-CBC)
    'auto_commit' => false,                            // Отключить автоматический коммит для ручного управления
    'start_session' => true,                           // Автоматически начинать сессию (по умолчанию: true)
    'test_mode' => false                               // Включить тестовый режим для разработки
]);

Параметры конфигурации

Параметр Описание Значение по умолчанию
save_path Каталог, где хранятся файлы сессий sys_get_temp_dir() . '/flight_sessions'
encryption_key Ключ для шифрования AES-256-CBC (опционально) null (без шифрования)
auto_commit Автоматически сохранять данные сессии при завершении работы true
start_session Автоматически начинать сессию true
test_mode Запуск в тестовом режиме без влияния на PHP сессии false
test_session_id Пользовательский идентификатор сессии для тестового режима (опционально) Генерируется случайно, если не установлен

Расширенное использование

Ручной коммит

Если вы отключите авто-коммит, вы должны вручную коммитить изменения:

$app->register('session', Session::class, ['auto_commit' => false]);

Flight::route('/update', function() {
    $session = Flight::session();
    $session->set('key', 'value');
    $session->commit(); // Явно сохранить изменения
});

Безопасность сессии с шифрованием

Включите шифрование для конфиденциальных данных:

$app->register('session', Session::class, [
    'encryption_key' => 'your-32-byte-secret-key-here'
]);

Flight::route('/secure', function() {
    $session = Flight::session();
    $session->set('credit_card', '4111-1111-1111-1111'); // Шифруется автоматически
    echo $session->get('credit_card'); // Дешифруется при получении
});

Регенация сессии

Регенерируйте идентификатор сессии для безопасности (например, после входа в систему):

Flight::route('/post-login', function() {
    $session = Flight::session();
    $session->regenerate(); // Новый ID, сохранить данные
    // ИЛИ
    $session->regenerate(true); // Новый ID, удалить старые данные
});

Пример промежуточного программного обеспечения

Защитите маршруты с помощью аутентификации на основе сессий:

Flight::route('/admin', function() {
    Flight::json(['message' => 'Добро пожаловать в панель управления']);
})->addMiddleware(function() {
    $session = Flight::session();
    if (!$session->get('is_admin')) {
        Flight::halt(403, 'Доступ запрещен');
    }
});

Это просто простой пример того, как использовать это в промежуточном программном обеспечении. Для более глубокого примера ознакомьтесь с документацией о промежуточном программном обеспечении.

Методы

Класс Session предоставляет эти методы:

  • set(string $key, $value): Сохраняет значение в сессии.
  • get(string $key, $default = null): Извлекает значение с опциональным значением по умолчанию, если ключ не существует.
  • delete(string $key): Удаляет конкретный ключ из сессии.
  • clear(): Удаляет все данные сессии.
  • commit(): Сохраняет текущие данные сессии в файловой системе.
  • id(): Возвращает текущий идентификатор сессии.
  • regenerate(bool $deleteOld = false): Регенерирует идентификатор сессии, опционально удаляя старые данные.

Все методы, кроме get() и id(), возвращают экземпляр Session для связывания.

Зачем использовать этот плагин?

  • Легковесный: Нет внешних зависимостей — только файлы.
  • Неблокирующий: Избегает блокировки сессий с помощью read_and_close по умолчанию.
  • Безопасный: Поддерживает шифрование AES-256-CBC для конфиденциальных данных.
  • Гибкий: Авто-коммит, тестовый режим и параметры ручного управления.
  • Нативный для Flight: Построен специально для фреймворка Flight.

Технические детали

  • Формат хранения: Файлы сессий имеют префикс sess_ и хранятся в настроенном save_path. Шифрованные данные используют префикс E, открытые данные используют P.
  • Шифрование: Использует AES-256-CBC с случайным IV для каждой записи сессии, когда предоставлен encryption_key.
  • Сбор мусора: Реализует SessionHandlerInterface::gc() PHP для очистки истекших сессий.

Участие

Вклад приветствуется! Сделайте форк репозитория, внесите изменения и отправьте пулл-запрос. Сообщайте об ошибках или предлагайте функции через трекер проблем GitHub.

Лицензия

Этот плагин лицензирован под MIT License. См. Github репозиторий для получения деталей.