Назад | Перейти на главную страницу

Удаление истекших файлов сеанса PHP в Ubuntu 14.04

Все началось с того, что MySQL не запустился.

После некоторого поиска в Интернете я обнаружил, что на сервере закончились inodes.

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/simfs     500000 500000      0  100% /
none           131072     56 131016    1% /dev
none           131072      1 131071    1% /sys/fs/cgroup
none           131072     63 131009    1% /run
none           131072      4 131068    1% /run/lock
none           131072      1 131071    1% /run/shm
none           131072      1 131071    1% /run/user

Дальнейший поиск в Google привел меня к предположению, что файлы сеанса PHP никогда не удаляются ... что кажется правдой, потому что выполняется ls php5 | wc -l дает мне 424669!

Я читал, что для PHP.ini session.gc_probability по умолчанию установлено значение 0, и что ubuntu обрабатывает очистку через cronjob /etc/cron.d/php5.

/etc/cron.d/php5

# /etc/cron.d/php5: crontab fragment for php5
#  This purges session files older than X, where X is defined in seconds
#  as the largest value of session.gc_maxlifetime from all your php.ini
#  files, or 24 minutes if not defined.  See /usr/lib/php5/maxlifetime

#Look for and purge old sessions every 30 minutes
09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] && [ -x /usr/lib/php5/sessionclean ] && [ -d /var/lib/php5 ] && /usr/lib/php5/sessionclean /var/lib/php5 $(/usr/lib/php5/maxlifetime)

Выглядит правильно, так почему этот скрипт не работает? Есть ли способ подтвердить, что это действительно запускается каждые 30 минут?

Файлы сеанса PHP никогда не удаляются

Вы не говорите, какой обработчик сеанса вы используете - предполагая, что это значение по умолчанию, сеансы с истекшим сроком действия должны быть очищены всякий раз, когда запускается сборка мусора сеанса. У вас слишком высокий уровень session.cache_expire и / или слишком низкий уровень session.gc_probability и / или слишком высокий уровень session.gc_divisor.

session.gc_probability по умолчанию имеет значение 0

Нет - только в системах Debian (Ubuntu является производным от Debian). Кто-то в Debian думает, что у него странные разрешения на хранилище сессий предотвращает взлом сессий. На самом деле это касается только очень узкое подмножество возможных атак - и когда вы примете соответствующие меры для борьбы с наиболее вероятными векторами атаки, проблема исчезнет.

Следствием этого является то, что вам нужен root-доступ, если вы хотите управлять своими сеансами PHP любым способом, кроме того, который был предварительно определен Debian.

В основном мне нравится Debian - но это всегда казалось мне довольно глупым.

Вы можете писать в системный журнал, используя команду Logger, так как вы запускаете его как Root.

&& logger -t PHP_SESSIONS "Сеансы PHP очищены"

затем "cat / var / log / syslog | grep PHP_SESSIONS"позже, чтобы увидеть время, которое он запускал.

Конечно, это просто говорит вам, что задание cron было выполнено, а не было ли оно успешным.