НАЧАЛО >> Оглавление >> Сервер приложений ИРБИС 64/128 >> Ядро системы >> Хранение PHP-сессий📄 Скачать в DOCX
Сервер приложений использует Irbis128SessionHandler для хранения PHP-сессий пользователей. Обработчик заменяет стандартное файловое хранилище PHP и совмещает быстрый кеш с постоянным хранением в SQLite.
На общем пути обработки запроса initsystem.php выполняет шаг "Старт сессии PHP" и подключает класс Irbis128SessionHandler. Класс регистрирует себя через session_set_save_handler() и запускает session_start(), если сессия еще не активна и HTTP-заголовки еще не отправлены.
Для служебных фоновых действий, которым не нужен пользовательский контекст, запуск сессии может быть пропущен. Это уменьшает количество лишних записей и блокировок при фоновой обработке.
Время жизни берется из настройки Authorisation->UserSessionLifeTime. Если настройка недоступна на раннем этапе инициализации, обработчик использует резервное значение 3600 секунд.
Значение синхронизируется с параметрами PHP:
| Параметр | Назначение |
|---|---|
session.gc_maxlifetime |
Максимальный возраст записи сессии для сборщика мусора. |
session.cookie_lifetime |
Время жизни cookie PHPSESSID. |
session.save_path |
Каталог данных установки, в котором размещается CurSessions.db. |
Обработчик использует три уровня:
| Уровень | Где хранится | Назначение |
|---|---|---|
| Локальный статический кеш | Память текущего PHP-процесса | Исключает повторное чтение одной и той же сессии в рамках текущего запроса. |
Системный Cache |
Ключ Session/<id> |
Дает быстрый доступ между обращениями. В зависимости от окружения использует L1, APCu или SQLite fallback общего кеша. |
| SQLite сессий | $OPTIONS['DataPath']/CurSessions.db |
Хранит сессию между перезапусками процесса и служит постоянным источником данных. |
SQLite-таблица sessions содержит поля id, data и last_accessed. Индекс idx_last_accessed ускоряет очистку устаревших сессий.
Перед чтением, записью и удалением проверяется ID сессии. Допустимы латинские буквы, цифры, запятая и дефис. Пустой или недопустимый ID не используется для обращения к кешу или SQLite.
Чтение выполняется по цепочке:
Cache по ключу Session/<id>;sessions в CurSessions.db, если запись не устарела по last_accessed.Если данные найдены в SQLite, они снова помещаются в быстрый кеш на время жизни сессии.
При записи обработчик сравнивает hash текущих данных с последним прочитанным значением. Если содержимое сессии не изменилось, через SessionUpdateTimestampHandlerInterface обновляется только last_accessed; сериализованные данные не перезаписываются. Если содержимое изменилось, запись обновляется в Cache и в SQLite через UPSERT.
destroy() удаляет запись из Cache, локального кеша и таблицы sessions. Сборщик мусора gc() удаляет из SQLite строки, у которых last_accessed меньше допустимого времени жизни. Записи в общем Cache дополнительно истекают по TTL.
Соединение с 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.
Обработчик устанавливает безопасные параметры PHP-сессии:
| Параметр | Значение | Эффект |
|---|---|---|
session.cookie_httponly |
1 |
Cookie сессии недоступна из JavaScript. |
session.use_strict_mode |
1 |
PHP принимает только созданные сервером ID сессий. |
session.cookie_samesite |
Lax |
Cookie ограничена для кросс-сайтовых переходов. |
Параметр session.cookie_secure в этом обработчике не включается автоматически. Если установка должна принимать cookie только по HTTPS, это настраивается и проверяется отдельно на уровне окружения.