Intereting Posts

очистить файлы сеанса php

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

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

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

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

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

  • session.gc_probability
  • session.gc_divisor
  • session.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 заполнит xargs файлами, которые будут удалены, а затем запустите команду rm намного меньше, чем -exec rm {} \; , который вызовет команду rm для каждого файла.

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

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

 find .session/ -atime +7 -exec rm {} \; 

Вы можете создать скрипт /etc/cron.hourly/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 

The Breakdown: Только файлы: 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 {} \;

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

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

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

Используйте ниже 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 

cd в директорию сессий, а затем:

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

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