Ответ
В PHP сессия по умолчанию хранится на сервере в виде файлов. Местоположение определяется директивой session.save_path в php.ini. Для распределённых систем или повышения производительности можно переопределить механизм хранения.
Стандартное хранение в файлах:
// Путь можно изменить динамически
ini_set('session.save_path', '/var/www/sessions');
session_start();
$_SESSION['user_id'] = 123;
// Файл сессии создаётся с именем вида sess_<session_id>
Использование Redis для сессий (часто в продакшене):
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379?auth=secret&database=1');
session_start();
Кастомный обработчик для хранения в БД (например, MySQL):
session_set_save_handler(
function ($savePath, $sessionName) { /* open */ return true; },
function () { /* close */ return true; },
function ($sessionId) { /* read */ return ''; },
function ($sessionId, $data) { /* write */ return true; },
function ($sessionId) { /* destroy */ return true; },
function ($maxLifetime) { /* gc */ return true; }
);
Ключевые моменты:
- Безопасность: Файлы сессий должны находиться вне публичной директории веб-сервера.
- Производительность: Файловое хранилище становится узким местом при высокой нагрузке. Redis или Memcached решают эту проблему.
- Распределённость: Для работы нескольких серверов приложений (например, за балансировщиком) необходимо общее хранилище сессий (Redis, БД).