FlightPHP Session - Легковесный обработчик сессий на основе файлов
Это легковесный плагин для обработки сессий на основе файлов для 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', // Каталог для файлов сессий
'prefix' => 'myapp_', // Префикс для файлов сессий
'encryption_key' => 'a-secure-32-byte-key-here', // Включить шифрование (рекомендуется 32 байта для AES-256-CBC)
'auto_commit' => false, // Отключить автоматическую фиксацию для ручного контроля
'start_session' => true, // Автоматически запускать сессию (по умолчанию: true)
'test_mode' => false, // Включить режим тестирования для разработки
'serialization' => 'json', // Метод сериализации: 'json' (по умолчанию) или 'php' (устаревший)
] ]);
Опции конфигурации
Опция | Описание | Значение по умолчанию |
---|---|---|
save_path |
Каталог, где хранятся файлы сессий | sys_get_temp_dir() . '/flight_sessions' |
prefix |
Префикс для сохраненного файла сессии | sess_ |
encryption_key |
Ключ для шифрования AES-256-CBC (необязательно) | null (без шифрования) |
auto_commit |
Автоматическое сохранение данных сессии при завершении | true |
start_session |
Автоматически запускать сессию | true |
test_mode |
Запуск в режиме тестирования без влияния на сессии PHP | false |
test_session_id |
Кастомный ID сессии для режима тестирования (необязательно) | Генерируется случайно, если не указано |
serialization |
Метод сериализации: 'json' (по умолчанию, безопасный) или 'php' (устаревший, позволяет объекты) | 'json' |
Режимы сериализации
По умолчанию эта библиотека использует сериализацию JSON для данных сессий, что безопасно и предотвращает уязвимости, связанные с внедрением объектов PHP. Если вам нужно хранить объекты PHP в сессии (не рекомендуется для большинства приложений), вы можете выбрать устаревшую сериализацию PHP:
'serialization' => 'json'
(по умолчанию):- Допускаются только массивы и примитивы в данных сессий.
- Безопаснее: устойчив к внедрению объектов PHP.
- Файлы имеют префикс
J
(простой JSON) илиF
(зашифрованный JSON).
'serialization' => 'php'
:- Позволяет хранить объекты PHP (используйте с осторожностью).
- Файлы имеют префикс
P
(простая сериализация PHP) илиE
(зашифрованная сериализация PHP).
Примечание: Если вы используете сериализацию JSON, попытка сохранить объект вызовет исключение.
Продвинутое использование
Ручная фиксация
Если вы отключите автоматическую фиксацию, вам нужно вручную фиксировать изменения:
$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'); // Дешифруется при извлечении
});
Регенерация сессии
Регенерируйте ID сессии для безопасности (например, после входа):
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, 'Доступ запрещен');
}
});
Это простой пример использования в промежуточном ПО. Для более подробного примера см. документацию по middleware.
Методы
Класс Session
предоставляет эти методы:
set(string $key, $value)
: Сохраняет значение в сессии.get(string $key, $default = null)
: Извлекает значение, с необязательным значением по умолчанию, если ключ не существует.delete(string $key)
: Удаляет конкретный ключ из сессии.clear()
: Удаляет все данные сессии, но сохраняет то же имя файла для сессии.commit()
: Сохраняет текущие данные сессии в файловую систему.id()
: Возвращает текущий ID сессии.regenerate(bool $deleteOldFile = false)
: Регенерирует ID сессии, включая создание нового файла сессии, сохраняя все старые данные, а старый файл остается в системе. Если$deleteOldFile
равенtrue
, старый файл сессии удаляется.destroy(string $id)
: Уничтожает сессию по ID и удаляет файл сессии из системы. Это частьSessionHandlerInterface
, и$id
обязателен. Типичное использование:$session->destroy($session->id())
.getAll()
: Возвращает все данные из текущей сессии.
Все методы, кроме get()
и id()
, возвращают экземпляр Session
для цепочки вызовов.
Почему использовать этот плагин?
- Легковесный: Нет внешних зависимостей — только файлы.
- Неблокирующее: Избегает блокировки сессий с
read_and_close
по умолчанию. - Безопасный: Поддерживает шифрование AES-256-CBC для конфиденциальных данных.
- Гибкий: Опции автоматической фиксации, режима тестирования и ручного контроля.
- Flight-Native: Разработан специально для фреймворка Flight.
Технические детали
- Формат хранения: Файлы сессий имеют префикс
sess_
и хранятся в настроенномsave_path
. Префиксы содержимого файлов:J
: Простой JSON (по умолчанию, без шифрования)F
: Зашифрованный JSON (по умолчанию с шифрованием)P
: Простая сериализация PHP (устаревшая, без шифрования)E
: Зашифрованная сериализация PHP (устаревшая с шифрованием)
- Шифрование: Использует AES-256-CBC с случайным IV на каждую запись сессии, когда предоставлен
encryption_key
. Шифрование работает как для режимов JSON, так и для PHP. - Сериализация: JSON — это режим по умолчанию и самый безопасный метод. Сериализация PHP доступна для устаревшего/продвинутого использования, но менее безопасна.
- Сбор мусора: Реализует
SessionHandlerInterface::gc()
для очистки истекших сессий.
Вклад
Вклад приветствуется! Создайте форк репозитория, внесите изменения и отправьте пул-реквест. Сообщайте об ошибках или предлагайте функции через трекер задач на Github.
Лицензия
Этот плагин лицензирован по лицензии MIT. См. репозиторий на Github для деталей.