Сервер: Настройка очистки сессий MODX (session.gc_probability / gc_divisor)

При установке/обновлении MODX Revo может появиться проверка:

Checking if sessions garbage collector are properly configured…

Смысл предупреждения простой: по умолчанию MODX хранит сессии в базе (modx_session), а очистка просрочки запускается через механизм PHP GC — по вероятности (session.gc_probability/session.gc_divisor). Если GC отключить или настроить неудачно, таблица сессий будет расти и со временем начнёт тормозить сайт и раздувать бэкапы.

1. Рекомендуемые значения:

  • Обычный сайт / средний трафик: session.gc_probability=1, session.gc_divisor=1000 (примерно 0.1% запросов запускают GC).
  • Очень высокий трафик (много PHP-хитов): можно увеличить divisor до 5000–10000, чтобы GC не срабатывал слишком часто.
  • Важно: не ставь session.gc_probability=0 (это по сути значит никогда не чистить для MODX-сессий).

2. Где это править

Вариант A: php.ini (глобально)

; php.ini (или отдельный ini в conf.d)
session.gc_probability = 1
session.gc_divisor = 1000

Вариант B: пул PHP-FPM (точечно для сайта)

; /etc/php-fpm.d/site.conf (пример)
php_value[session.gc_probability] = 1
php_value[session.gc_divisor] = 1000

Вариант C: .user.ini (если разрешено на хостинге)

; .user.ini в корне сайта
session.gc_probability=1
session.gc_divisor=1000

Вариант D: .htaccess (только Apache, если разрешено)

php_value session.gc_probability 1
php_value session.gc_divisor 1000

Проверка: открой phpinfo() (временно) и найди session.gc_probability/session.gc_divisor — там должны быть новые значения.


Альтернативы (когда лучше иначе)

  • Периодическая чистка по крону: полезно для низкого трафика и когда нужно, например, гарантированно раз в сутки.
  • Сессии в Redis: снижает нагрузку на MySQL, но усложняет инфраструктуру.

Разовая безопасная чистка (если таблица уже распухла)

Если нужно быстро сдуть modx_session, ориентируйся на TTL. В MODX часто используют системную настройку session_gc_maxlifetime (например, 806400 секунд = 7 дней).

-- пример: удалить всё, что не обновлялось дольше 7 дней (806400 секунд)
DELETE FROM modx_session WHERE access < (UNIX_TIMESTAMP() - 806400);
Просмотров: 305
Материал помог? Оценка помогает находить устаревшие и спорные решения.

Комментарии

0

Нашли ошибку или хотите дополнить материал?

Комментариев пока нет.Можно первым дополнить материал или сообщить об ошибке.
Telegram