Ответ
В 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, БД).
Ответ 18+ 🔞
Слушай, а ведь эта тема с сессиями — просто ёперный театр! Все думают, что там какая-то магия, а на самом деле всё просто, как три копейки. По умолчанию PHP тупо складывает данные сессии в файлики на сервере. Место, где эти файлы валяются, задаётся в session.save_path. Но если у тебя не один сервер, а целая орава, или нагрузка овердохуища, то с файлами будет полный пиздец.
Вот смотри, как это обычно выглядит, когда всё по-простому:
// Меняем путь, куда складывать файлы сессий, чтобы они не болтались где попало
ini_set('session.save_path', '/var/www/sessions');
session_start();
$_SESSION['user_id'] = 123;
// И где-то в папке /var/www/sessions появится файл типа sess_ahsgd7123hasd
Но это, чувак, вариант для дедушкиного сайта-визитки. Как только народ повалит толпой, сервер начнёт бздеть от попыток найти и прочитать нужный файлик среди тысяч других. Волнение ебать!
Поэтому в нормальном, боевом продакшене все юзают 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 или БД. Иначе — манда с ушами.