Кажется, я обнаружил проблему. Этот конкретный клиент хотел сеансы, которые заканчивались только тогда, когда они выходили из системы или закрывали окно браузера. Поэтому я установил истечение сеанса на ноль (0).
Я думал, что сборщик мусора будет удалять сеансы только изредка (учитывая, что в codeigniter я понимаю, что 0 означает, что сеанс заканчивается через два года), и что я догоню его со своей собственной сборкой мусора. Однако я начал замечать, что таблица ci_sessions (я перенесла данные сеанса в базу данных из файловой системы, чтобы помочь отладить эту проблему) часто удаляла несколько сеансов, даже если ни одному из сеансов не было около двух лет.
Что, похоже, решило проблему, так это полностью отключить сборку мусора, установив для параметра PHP sessions.gc_probability значение 0.
Нет сборки мусора, нет преждевременного удаления переменных сеанса.
Я выполняю ночную работу CRON для сборки мусора из таблицы ci_sessions.