Почему могут пропадать сессии в PHP при большой нагрузке

Недавно столкнулся с вопросом, почему пропадают PHP-сессии при высокой нагрузке. Как известно, что по умолчанию сессии PHP хранятся в обычных текстовых файлах. В Debian/Ubuntu эти файлы располагаются в /var/lib/php/sessions/, в других дистрибутивах путь может отличаться. Сами файлы по размеру невелики, но если сессия открывается при каждом обращении к сайту, то когда на сайт заходит поисковый робот, таких файлов может создаваться весьма большое количество. Как этого избежать, я описывал в одном из предыдущих сообщений.
Теперь же рассмотрим ситуацию, когда сессию создавать действительно надо, но она не создается. Вероятная причина подобного — нехватка свободных inodes. Inodes — это записи в файловой системе, используемые для описания, где находится файл, и для каждой сессии PHP требуется как минимум один свободный inode. Если они заканчиваются, то создавать файлы становится невозможно, даже если на диске еще много свободного места. Количество inodes ограничено либо настройками файловой системы (на выделенных серверах и VDS под Xen), либо тарифным планом (на shared-хостинге и VDS под OpenVZ). Кроме того, на shared-хостингах обычно также существуют лимиты на количество файлов, не связанные с inode.
Проверить количество свободных inodes можно с помощью команды
df -i
 в командной строке, а посмотреть лимит на создание файлов — в панели управления хостингом. Для нормальной работы необходимо, чтобы запас и того, и другого составлял хотя бы десять тысяч.
Если стало ясно, что проблема не в inodes, проверьте, что в php.ini корректно выставлены параметры session.gc_maxlifetime, session.gc_probability и session.gc_divisor. И что ни в одном из скриптов, выполняемых на сервере они не меняются через функцию ini_set. Также имеет смысл заглянуть в crontab (на shared-хостинге он может называться «планировщик заданий»), и проверить, что там нет никаких скриптов, которые могли бы очищать каталог с сессиями.