Очистить файлы сеанса php
На моем веб-сайте я использую сеансы PHP. Информация сеанса хранится в файлах в моем пути. /session. Через несколько месяцев я обнаружил, что эти файлы сеансов никогда не удаляются, к настоящему времени в этом каталоге 145 000 из них.
Как их очистить? Должен ли я делать это программно или это параметр, который я могу использовать где-нибудь, чтобы эта очистка происходила автоматически?
EDIT забыл упомянуть: этот сайт работает у поставщика, поэтому у меня нет доступа к командной строке. У меня есть ftp-доступ, но файлы сеансов принадлежат другому пользователю (тот, который, как я полагаю, запускает веб-сервер). Из первых ответов, которые я получил, я думаю, что это не просто настройка на сервере или PHP, поэтому я думаю, что я должны реализовать что-то для него в PHP и периодически вызывать это из браузера (возможно, из задания cron, запущенного на моей собственной машине дома)
Ответы
Ответ 1
Чтобы правильно обрабатывать сеанс, посмотрите http://php.net/manual/en/session.configuration.php.
Здесь вы найдете следующие переменные:
- session.gc_probability
- session.gc_divisor
- session.gc_maxlifetime
Они управляют вероятностью запуска сборщика мусора (GC) с каждым запросом страницы.
В начале файла script или .htaccess вы можете установить те, у кого ini_set(), чтобы вы в определенной степени получили определенность они будут удалены когда-нибудь.
Ответ 2
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
Максимальное время script просто возвращает количество минут, в течение которых сеанс должен оставаться в живых, проверяя 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
Ответ 3
Если кто-то хочет сделать это с помощью 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
для каждого файла.
Только мои два цента
Ответ 4
Используйте cron with find для удаления файлов старше заданного порога.
Например, чтобы удалить файлы, которые не были доступны в течение как минимум недели.
find .session/ -atime +7 -exec rm {} \;
Ответ 5
Вы можете создать script/etc/cron.hourly/php и поместить туда:
#!/bin/bash
max=24
tmpdir=/tmp
nice find ${tmpdir} -type f -name 'sess_*' -mmin +${max} -delete
Затем выполните исполняемый файл script (chmod + x).
Теперь каждый час будут удалены все файлы сеанса с данными, измененными более 24 минут назад.
Ответ 6
# 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
Разбивка:
Только файлы: find/var/lib/php5/-type f
Старее чем минут: -cmin
Получить настройки php: $(echo "` php -i | grep -i session.gc_maxlifetime
Сделайте математику: | cut -d '' -f3`/60 "| bc)
Файлы соответствия RM: -exec rm -f {} \;
Ответ 7
Мое лучшее предположение заключается в том, что вы находитесь на общем сервере, и файлы сеансов перемещаются вместе со всеми пользователями, поэтому вы не можете и не должны их удалять. Что вы можете сделать, если вас беспокоит масштабирование и/или конфиденциальность ваших сеансов пользователей, заключается в перемещении сеансов в базу данных.
Начните писать это Cookie в базу данных, и у вас есть длинный путь к масштабированию вашего приложения на нескольких серверах, когда придет время.
Кроме того, я бы не стал сильно волноваться с 145.000 файлами.
Ответ 8
Используйте ниже 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
Ответ 9
cd в каталог сессий, а затем:
1) Просмотр сеансов старше 40 мин:
find . -amin +40 -exec stat -c "%n %y" {} \;
2) Удаление сеансов старше 40 мин:
find . -amin +40 -exec rm {} \;