Хранение PHP-сессий


НАЧАЛО >> Оглавление >> Сервер приложений ИРБИС 64/128 >> Ядро системы >> Хранение PHP-сессий📄 Скачать в DOCX


Сервер приложений использует Irbis128SessionHandler для хранения PHP-сессий пользователей. Обработчик заменяет стандартное файловое хранилище PHP и совмещает быстрый кеш с постоянным хранением в SQLite.

1. Подключение обработчика

На общем пути обработки запроса initsystem.php выполняет шаг "Старт сессии PHP" и подключает класс Irbis128SessionHandler. Класс регистрирует себя через session_set_save_handler() и запускает session_start(), если сессия еще не активна и HTTP-заголовки еще не отправлены.

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

2. Время жизни сессии

Время жизни берется из настройки Authorisation->UserSessionLifeTime. Если настройка недоступна на раннем этапе инициализации, обработчик использует резервное значение 3600 секунд.

Значение синхронизируется с параметрами PHP:

Параметр Назначение
session.gc_maxlifetime Максимальный возраст записи сессии для сборщика мусора.
session.cookie_lifetime Время жизни cookie PHPSESSID.
session.save_path Каталог данных установки, в котором размещается CurSessions.db.

3. Уровни хранения

Обработчик использует три уровня:

Уровень Где хранится Назначение
Локальный статический кеш Память текущего PHP-процесса Исключает повторное чтение одной и той же сессии в рамках текущего запроса.
Системный Cache Ключ Session/<id> Дает быстрый доступ между обращениями. В зависимости от окружения использует L1, APCu или SQLite fallback общего кеша.
SQLite сессий $OPTIONS['DataPath']/CurSessions.db Хранит сессию между перезапусками процесса и служит постоянным источником данных.

SQLite-таблица sessions содержит поля id, data и last_accessed. Индекс idx_last_accessed ускоряет очистку устаревших сессий.

4. Чтение и запись

Перед чтением, записью и удалением проверяется ID сессии. Допустимы латинские буквы, цифры, запятая и дефис. Пустой или недопустимый ID не используется для обращения к кешу или SQLite.

Чтение выполняется по цепочке:

  1. локальный статический кеш текущего процесса;
  2. системный Cache по ключу Session/<id>;
  3. таблица sessions в CurSessions.db, если запись не устарела по last_accessed.

Если данные найдены в SQLite, они снова помещаются в быстрый кеш на время жизни сессии.

При записи обработчик сравнивает hash текущих данных с последним прочитанным значением. Если содержимое сессии не изменилось, через SessionUpdateTimestampHandlerInterface обновляется только last_accessed; сериализованные данные не перезаписываются. Если содержимое изменилось, запись обновляется в Cache и в SQLite через UPSERT.

5. Очистка

destroy() удаляет запись из Cache, локального кеша и таблицы sessions. Сборщик мусора gc() удаляет из SQLite строки, у которых last_accessed меньше допустимого времени жизни. Записи в общем Cache дополнительно истекают по TTL.

6. SQLite и диагностика

Соединение с SQLite открывается лениво, только при первом реальном чтении или записи. При открытии применяется:

Настройка Назначение
busyTimeout(5000) Ожидание освобождения блокировки SQLite до 5 секунд.
PRAGMA journal_mode=WAL Режим журнала для одновременного чтения и записи.
PRAGMA synchronous=NORMAL Снижение избыточной синхронизации записи.
PRAGMA temp_store=MEMORY Хранение временных данных в памяти.
PRAGMA mmap_size=268435456 Использование memory-mapped I/O для чтения.

Все SQL-операции используют подготовленные выражения. Критические ошибки открытия базы, чтения, записи, удаления и очистки пишутся в Session.log.

Если сессии не сохраняются или быстро теряются, сначала нужно проверить доступность и права записи каталога $OPTIONS['DataPath'], наличие CurSessions.db, ошибки в Session.log и значение Authorisation->UserSessionLifeTime.

7. Безопасность cookie

Обработчик устанавливает безопасные параметры PHP-сессии:

Параметр Значение Эффект
session.cookie_httponly 1 Cookie сессии недоступна из JavaScript.
session.use_strict_mode 1 PHP принимает только созданные сервером ID сессий.
session.cookie_samesite Lax Cookie ограничена для кросс-сайтовых переходов.

Параметр session.cookie_secure в этом обработчике не включается автоматически. Если установка должна принимать cookie только по HTTPS, это настраивается и проверяется отдельно на уровне окружения.