21.10.2010

PHP-сессии можно писать в память, вместо диска

Извечная проблема на серверах, не сильно подготовленных к хостингу: шокирующее количество сессий всего за несколько месяцев заполняют все i-ноды и сервер заклинивает.
Очистить существующие не проблема за пару дней, командой
find /path/to/sessions -exec rm -rf {} \;
А некоторые умельцы даже как-то делают это мгновенно при помощи WinSCP. Но как избежать ситуации в будущем?



Нужно сделать две вещи: настроить сборку мусора (garbage collection) и смонтировать эту директорию в память. Первое очевидно для чего, а второе для быстрой обработки stat сессии и для моментального решения вопроса в случае сбоя. Stat сессии нужен для GC потому, что PHP самостоятельно выискивает среди сессий те, что живут более заданного времени и удаляет из них выборочные.
Итак настраиваем php.ini:
session.gc_probability = 1
session.gc_divisor     = 100
session.gc_maxlifetime = 3600

А также не забываем откорректировать путь к сессиям в /etc/cron.d/php5.

А когда все сессии удалены, то можно смонтировать директорию в память и тогда серверу будет значительно легче как делать stat, так и удалять:
mount -t tmpfs /dev/shm /path/to/sessions

А если что-то переполнилось, то удаляются сессии мнгоновенно:
mount -o remount /path/to/sessions
Таким образом, сессии просто испаряются в памяти.

Комментариев нет:

Отправить комментарий