Где хранится сессия в PHP?

Ответ

В 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 или БД. Иначе — манда с ушами.