очистка файлов сессии php - PullRequest
57 голосов
/ 17 марта 2009

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

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

РЕДАКТИРОВАТЬ забыл упомянуть: этот сайт работает у провайдера, поэтому у меня нет доступа к командной строке. У меня есть ftp-доступ, но файлы сессий принадлежат другому пользователю (я думаю, тот, который запускает процесс веб-сервера). Из первых полученных ответов я думаю, что это не просто настройка на сервере или PHP, поэтому я предполагаю, что Я должен реализовать что-то для этого в PHP и периодически вызывать это из браузера (может быть, из-за задания cron, работающего на моей собственной машине дома)

Ответы [ 9 ]

54 голосов
/ 17 марта 2009

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

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

  • session.gc_probability
  • session.gc_divisor
  • session.gc_maxlifetime

Они контролируют вероятность запуска сборщика мусора (GC) с каждым запросом страницы.

Вы можете установить их с помощью ini_set () в начале вашего скрипта или файла .htaccess, чтобы вы были уверены, что в какой-то степени они будут удалены когда-нибудь.

35 голосов
/ 17 марта 2009

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
21 голосов
/ 30 января 2014

Если кто-то захочет сделать это с помощью 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 для каждого файла.

Только мои два цента

5 голосов
/ 13 мая 2013

Вы можете создать скрипт /etc/cron.hourly/php и поместить туда:

#!/bin/bash

max=24
tmpdir=/tmp

nice find ${tmpdir} -type f -name 'sess_*' -mmin +${max} -delete

Затем сделайте скрипт исполняемым (chmod + x).

Теперь каждый час будут удаляться все файлы сеансов, данные которых были изменены более 24 минут назад.

5 голосов
/ 17 марта 2009

Используйте cron с find для удаления файлов старше указанного порога. Например, чтобы удалить файлы, к которым не обращались как минимум неделю.

find .session/ -atime +7  -exec rm {} \;
3 голосов
/ 25 февраля 2014
# 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
Старше, чем минуты: -мин
Получить настройки php: $ (echo "` php -i | grep -i session.gc_maxlifetime
Сделайте математику: | cut -d '' -f3` / 60 "| bc)
Файлы соответствия RM: -exec rm -f {} \;

2 голосов
/ 30 марта 2017

перейдите в каталог сессий и затем:

1) Просмотр сеансов старше 40 минут: find . -amin +40 -exec stat -c "%n %y" {} \;

2) Удалить сеансы старше 40 минут: find . -amin +40 -exec rm {} \;

2 голосов
/ 18 марта 2009

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

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

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

0 голосов
/ 07 августа 2015

Используйте ниже 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...