очистка файлов сеансов php


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

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

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

 53
Author: Jack, 2009-03-17

9 answers

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

Там вы найдете следующие переменные:

  • сессия.gc_ вероятность
  • сеанс.gc_divisor
  • сеанс.gc_maxlifetime

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

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

 52
Author: Seb, 2017-05-25 09:50:59

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
 33
Author: Paul Dixon, 2009-03-17 13:50:52

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

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

 20
Author: Andi, 2016-07-08 02:43:48

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

find .session/ -atime +7  -exec rm {} \;
 5
Author: vartec, 2009-03-17 13:46:56

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

#!/bin/bash

max=24
tmpdir=/tmp

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

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

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

 5
Author: Daniel Milde, 2013-05-13 10:50:39
# 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 {} \;

 3
Author: Dr. Tyrell, 2014-02-25 00:25:31

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

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

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

 2
Author: Frankie, 2010-06-20 04:48:12

Компакт-диск в каталог сеансов, а затем:

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

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

 1
Author: David Lefkon, 2017-03-30 16:36:53

Используйте ниже 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
 0
Author: MaheshPatade, 2015-09-21 05:51:17