Очистка файлов PHP сессии



на моем сайте я использую PHP сессии. Информация о сеансе хранится в файлах в my ./ путь к сеансу. Через несколько месяцев я обнаружил, что эти файлы сессий не удаляются, сейчас есть 145.000 их в этот каталог.



как они должны быть очищены? Должен ли я делать это программно, или это параметр, который я могу использовать где-то, чтобы эта очистка происходила автоматически?



EDIT забыл упомянуть: этот сайт работает на поставщик, поэтому у меня нет доступа к командной строке. У меня есть ftp-доступ, но файлы сеанса принадлежат другому пользователю (тот, который работает на веб-сервере proces, я думаю) из первых ответов, которые я получил, я думаю, что это не просто настройка на сервере или PHP, поэтому я думаю, что мне придется реализовать что-то для него в PHP и периодически вызывать это из браузера (возможно, из задания cron, работающего на моей собственной машине дома)

880   9  
PHP

9 ответов:

чтобы правильно обработать сеанс, взгляните на http://php.net/manual/en/session.configuration.php.

там вы найдете эти переменные:

  • сессии.gc_probability
  • сессии.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]\+\).*$//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 {} \;, который будет вызывать для каждого файл.

просто мои два цента

используйте 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 / - type f
Старше минуты: - cmin
Получить настройки php:$(echo "`php-I|grep-i сессия.gc_maxlifetime
Сделайте математику: / cut-d ''- f3 '/ 60" / bc)
РМ соответствующие файлы: - exec rm-f {} \;

Я думаю, что вы находитесь на общем сервере, и файлы сеанса смешиваются со всеми пользователями, поэтому вы не можете и не должны их удалять. То, что вы можете сделать, если вы беспокоитесь о масштабировании и/или конфиденциальности сеанса ваших пользователей, - это переместить сеансы в базу данных.

начните писать этот файл Cookie в базу данных, и у вас есть долгий путь к масштабированию вашего приложения на нескольких серверах, когда придет время.

кроме того, я бы не стал сильно беспокоиться 145.000 файлов.

cd в каталог сеансов, а затем:

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

Comments

    Ничего не найдено.