очистка файлов сеансов php
На своем веб-сайте я использую сеансы PHP. Информация о сеансе хранится в файлах по пути к моему./сеансу. Через несколько месяцев я обнаружил, что эти файлы сеансов никогда не удаляются, к настоящему времени в этом каталоге их 145 000.
Как их следует очистить? Должен ли я делать это программно, или есть параметр, который я могу использовать где-нибудь, чтобы эта очистка происходила автоматически?
РЕДАКТИРОВАТЬ забыл упомянуть: этот сайт работает у провайдера, поэтому я не иметь доступ к командной строке. У меня есть ftp-доступ, но файлы сеанса принадлежат другому пользователю (я думаю, тот, который запускается на веб-сервере) Из первых ответов, которые я получил, я думаю, что это не просто настройка на сервере или PHP, поэтому, я думаю, мне придется что-то реализовать для этого на PHP и периодически вызывать это из браузера (возможно, из задания cron, запущенного на моей собственной машине дома)
9 answers
Чтобы правильно обрабатывать сеанс, взгляните на http://php.net/manual/en/session.configuration.php.
Там вы найдете следующие переменные:
- сессия.gc_ вероятность
- сеанс.gc_divisor
- сеанс.gc_maxlifetime
Они управляют вероятностью запуска сборщика мусора (GC) при каждом запросе страницы.
Вы можете задать их с помощью ini_set() в начале вашего скрипта или файла .htaccess, чтобы получить уверенность в какой-то степени они когда-нибудь будут удалены.
Debian/Ubuntu обрабатывает это с помощью cronjob, определенного в /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 [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm
Скрипт maxlifetime просто возвращает количество минут, в течение которых сеанс должен поддерживаться, проверяя php.ini, это выглядит так
#!/bin/sh -e
max=1440
for ini in /etc/php5/*/php.ini; do
cur=$(sed -n -e 's/^[[:space:]]*session.gc_maxlifetime[[:space:]]*=[[:space:]]*\([0-9]\+\).*$/\1/p' $ini 2>/dev/null || true);
[ -z "$cur" ] && cur=0
[ "$cur" -gt "$max" ] && max=$cur
done
echo $(($max/60))
exit 0
В случае, если кто-то хочет сделать это с помощью cronjob, пожалуйста, имейте в виду, что это:
find .session/ -atime +7 -exec rm {} \;
Очень медленно, когда у вас много файлов.
Рассмотрите возможность использования этого вместо этого:
find .session/ -atime +7 | xargs -r rm
Если в именах файлов есть пробелы, используйте следующее:
find .session/ -atime +7 -print0 | xargs -0 -r rm
xargs
заполнит командную строку файлами, подлежащими удалению, затем запустите команду rm
намного меньшую, чем -exec rm {} \;
, которая вызовет команду rm
для каждого файла.
Только мои два цента
Используйте cron с find для удаления файлов старше заданного порога. Например, чтобы удалить файлы, к которым не было доступа по крайней мере неделю.
find .session/ -atime +7 -exec rm {} \;
Вы можете создать скрипт /etc/cron.почасово/php и поместите туда:
#!/bin/bash
max=24
tmpdir=/tmp
nice find ${tmpdir} -type f -name 'sess_*' -mmin +${max} -delete
Затем сделайте скрипт исполняемым (chmod+x).
Теперь каждый час будут удаляться все файлы сеанса с данными, измененными более 24 минут назад.
# Every 30 minutes, not on the hour<br>
# Grabs maxlifetime directly from \`php -i\`<br>
# doesn't care if /var/lib/php5 exists, errs go to /dev/null<br>
09,39 * * * * find /var/lib/php5/ -type f -cmin +$(echo "\`php -i|grep -i session.gc_maxlifetime|cut -d' ' -f3\` / 60" | bc) -exec rm -f {} \\; >/dev/null 2>&1
Разбивка:
Только файлы: найти /var/lib/php5/ - тип f
Старше нескольких минут: -cmin
Получить настройки php: $(echo"`сеанс php-i|grep-i.gc_maxlifetime
Посчитайте: |вырезать -d'' -f3` /60" |до н. э.)
Соответствующие файлы RM: -exec rm -f {} \;
Я бы предположил, что вы находитесь на общем сервере, и файлы сеансов смешаны у всех пользователей, поэтому вы не можете и не должны удалять их. Что вы можете сделать, если вас беспокоит масштабирование и/или конфиденциальность сеансов ваших пользователей, так это переместить сеансы в базу данных.
Начните записывать этот файл cookie в базу данных, и вам предстоит пройти долгий путь к масштабированию вашего приложения на нескольких серверах, когда придет время.
Кроме того, я бы не стал сильно беспокоиться о 145 000 файлы.
Компакт-диск в каталог сеансов, а затем:
1) Просмотр сеансов старше 40 минут:
find . -amin +40 -exec stat -c "%n %y" {} \;
2) Удалить сеансы старше 40 минут:
find . -amin +40 -exec rm {} \;
Используйте ниже cron:
39 20 * * * root [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm