Перейти к содержимому

Could not start session by PHP - сессия не стартует

Сайт целиком отдаёт ошибку о невозможности начать сессию. Разбираем причины в порядке убывания частоты.

Как проверить

Смотрим, где и чем хранятся сессии:

Окно терминала
php -i | grep -E "session.save_handler|session.save_path"
# handler files - каталог на диске, memcached или redis - внешнее хранилище
# у веб-версии и консоли настройки бывают разными: смотреть нужно веб-версию

Обработчик хранения определяет весь дальнейший разбор. Для файлов проверяют каталог и место, для внешнего хранилища - доступность службы, и это два разных списка проверок.

Проверяем каталог сессий:

Окно терминала
ls -ld /var/lib/php/sessions
sudo -u www-data test -w /var/lib/php/sessions && echo "запись есть" || echo "записи нет"
ls /var/lib/php/sessions | wc -l # сколько файлов сессий накопилось
find /var/lib/php/sessions -mtime +7 | wc -l # и сколько из них старше недели

Смотрим место и число свободных записей файловой системы:

Окно терминала
df -h | tail -5
df -i | tail -5
# место может быть, а свободные записи закончиться: миллионы мелких файлов сессий

Свободные записи файловой системы кончаются раньше места. Каталог сессий, из которого давно не убирали старые файлы, - самый частый способ довести до этого состояния целый сервер.

Проверяем внешнее хранилище:

Окно терминала
echo stats | nc -w2 127.0.0.1 11211 | head -5 # отвечает ли служба кэша
grep -rn "session" bitrix/.settings.php | head -5
# недоступное хранилище сессий роняет сайт целиком, а не замедляет его

Причины

  1. Нет прав на каталог сессий или его не существует примерно 30% случаев

    ПризнакОшибка появилась после переноса, смены пользователя процессов или обновления системы.

    ПроверкаСмотрим путь хранения сессий и пробуем записать в него от имени процессов сайта.

    Что делатьСоздаём каталог и выравниваем владельца с пользователем процессов языка, не открывая права всем подряд.

  2. Кончилось место или свободные записи файловой системы примерно 25% случаев

    ПризнакОдновременно перестают работать кэш, загрузка файлов и журналы.

    ПроверкаСмотрим свободное место и свободные записи файловой системы на разделе с сессиями.

    Что делатьЧистим старые файлы сессий и журналы, включаем их регулярную уборку по расписанию.

  3. Внешнее хранилище сессий недоступно примерно 20% случаев

    ПризнакСайт упал целиком и разом, при этом на диске всё в порядке.

    ПроверкаПроверяем, отвечает ли служба хранения на своём адресе и порту с сервера сайта.

    Что делатьПоднимаем службу и добавляем её в наблюдение: её падение равносильно падению всего сайта.

  4. Сессии хранятся в базе, а база перегружена примерно 15% случаев

    ПризнакОшибка приходит под нагрузкой или во время обновления, вместе с долгими запросами.

    ПроверкаСмотрим состояние базы и блокировки в момент ошибки, а также включённое хранение сессий в базе.

    Что делатьРазбираем нагрузку на базу; на время работ хранение сессий возвращают в файлы.

  5. Путь хранения остался от прежнего сервера примерно 10% случаев

    ПризнакОшибка появилась сразу после переезда и на всех страницах одновременно.

    ПроверкаСравниваем путь хранения сессий в настройках языка с тем, что реально существует на сервере.

    Что делатьПриводим путь к существующему каталогу и проверяем его права от имени процессов сайта.

Если ничего не помогло

Возвращаем хранение сессий в файлы на время разбора. Это самый простой способ отделить проблему хранилища от проблемы самого сайта: с файлами сессии работают почти всегда.

Смотрим журнал ошибок языка, а не только страницу. Сообщение на экране короткое, а в журнале рядом обычно лежит вторая строка с реальной причиной: отказ по правам, отсутствие каталога или недоступность службы.

Проверяем уборку старых сессий. Если её нет, каталог растёт месяцами, и однажды сайт останавливается не из-за нагрузки, а из-за закончившихся записей файловой системы.

Частые вопросы

Почему сайт падает целиком, а не отдельные страницы?

Сессия открывается в прологе, до выполнения кода страницы. Если она не стартовала, до страницы дело не доходит вовсе, и ошибка одинакова везде, включая административный раздел.

Стоит ли хранить сессии в memcached?

На нагруженном сайте - да, это быстрее файлов и удобно в кластере. Но падение службы кладёт сайт целиком, поэтому её обязательно ставят под наблюдение.

Как понять, что кончились записи файловой системы?

Отдельной командой: свободное место может оставаться, а записи закончиться. Верный признак - одновременный отказ кэша, загрузки файлов и журналов при свободном диске.

Нужно ли чистить старые файлы сессий вручную?

Уборкой обычно занимается сам язык по расписанию, но на части площадок она отключена. Если каталог растёт месяцами, чистку ставят отдельным заданием.

Что сделать первым делом на боевом сайте?

Проверить место и права на каталог сессий: это две самые частые причины и обе чинятся за минуту. Разбор хранилища и базы имеет смысл только после них.

Смежное

Первоисточник