Как правило, невозможно сохранить одновременную информацию о состоянии сеанса для всех пользователей без значительного снижения производительности. Как вы уже сказали, это является результатом неспособности правильно завершить сеанс, когда один раз.
На данный момент у вас есть два варианта:
1. Запустить задание cron (детерминированное)
Вы можете настроить работу cron так часто, как вам нужно. Это гарантирует, что имеющаяся у вас информация не старше возраста cron.
2. Установить вероятность GC сеанса
Установка опций PHP session.gc_probability
и session.gc_divisor
позволяет указать вероятность, с которой будет запускаться очистка сеанса при каждом запросе . Как правило, это относительно низкое значение (например, 1/100), потому что при очень высоких нагрузках на сервер это может очень быстро снизить производительность.
Преимущества этого подхода в том, что он встроен и ничего не стоит, если ваш сервер фактически не поражен пользователями.
Основным недостатком является то, что вероятность всегда должна настраиваться с учетом количества запросов / сек на вашем сервере, которое не является константой. Другими недостатками являются тот факт, что он зависит от запросов на фактическую работу (никогда не будет очищать сеансы, если никто не посещает ваш сервер) и что это глобальная настройка (работает для всего сервера, а не для всего приложения).