Если сессия на сайте не работает — пользователь разлогинивается, корзина обнуляется, данные формы теряются между страницами, — в 90% случаев причина в одном из трёх мест: куки браузера, настройки session в PHP (или другом бэкенде) и права доступа к папке с файлами сессий. Проверять нужно именно в этом порядке.
Что проверить в первую очередь
- Открыты ли куки в браузере — сессия обычно держится на cookie PHPSESSID (или аналоге в вашем фреймворке). Отключённые сторонние куки или режим инкогнито с блокировкой — частая причина.
- Совпадает ли домен и протокол — сессия, начатая на http://site.ru, не будет видна на https://site.ru, если куки выставлены с другим флагом Secure или доменом (например, с www и без www).
- Не перезаписывается ли session_start() — если он вызывается дважды или после отправки заголовков, PHP может выдавать предупреждение и не сохранять данные.
Почему сессия «слетает» сама по себе
Если сессия работает, но периодически обнуляется без действий пользователя — смотрите в сторону серверных настроек:
- session.gc_maxlifetime в php.ini — если стоит слишком маленькое значение (по умолчанию 1440 секунд, 24 минуты), сессия истечёт быстрее, чем ожидает пользователь.
- Права на папку session.save_path (обычно /tmp или отдельная папка на хостинге) — если PHP не может писать в неё, сессия создаётся заново на каждой загрузке страницы.
- Балансировка нагрузки на нескольких серверах — если сайт крутится на нескольких машинах без общего хранилища сессий (Redis, Memcached, БД), запросы могут попадать то на один сервер, то на другой, и сессия «теряется».
- Антивирус или расширения браузера, блокирующие сторонние скрипты, из-за которых AJAX-запросы с сессионными куками не долетают до сервера.
Как быстро продиагностировать проблему
Добавьте временно в код после session_start() вывод var_dump($_SESSION) и session_id() — так видно, создаётся ли сессия вообще и сохраняются ли в неё данные между запросами. Проверьте в DevTools браузера (вкладка Application → Cookies), действительно ли кука с ID сессии приходит от сервера и не удаляется сразу после установки — если удаляется, дело в атрибутах cookie (Domain, Path, SameSite, Secure) или в системном времени сервера, которое может быть выставлено некорректно.
Если сайт работает через CDN или прокси (например, Cloudflare), убедитесь, что кэшируются только статические файлы, а не страницы с сессионными cookie — иначе один пользователь может получить кэшированную страницу с чужой сессией.
Что делать, если ничего не помогло
Если стандартные проверки не выявили причину, стоит перейти на хранение сессий в БД или Redis вместо файловой системы — это снимает проблемы с правами доступа и с несколькими серверами разом. Также полезно временно включить display_errors на тестовом окружении (не на боевом сайте) — часто причина в тихой php-ошибке до вызова session_start(), которая мешает корректно установить заголовки.