Назад | Перейти на главную страницу

Каталог сессий PHP продолжает заполняться до переполнения

У меня проблема с папкой данных сеанса PHP. Кажется, что сеансы не истекают и достигли какого-то ограничения, предположительно ограничения файловой системы для файлов в каталоге. Запросы, включающие сеансы записи, завершаются с фатальной ошибкой из-за нехватки места на диске.

Я временно обошел это, указав на sessions.save_path в новый каталог.

Хотел бы знать, что не так с моим php.ini это предотвращает истечение срока действия сеансов.

Также я попытался усечь sessions каталог с использованием rm а кажется, что он висит вечно?

Каталог проблем:

drwxr-xr-x  2 www-data www-data 294215680 Jan  5 13:42 sessions

Сессионный раздел php.ini:

[Session]
session.save_handler = files
session.save_path = "N;/var/www/data/sessions"
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 2592000
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 0
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
session.save_path = "N;/var/www/data/sessions"

Кажется, что это не вызывает проблемы (поскольку PHP, очевидно, генерирует сеансы), но это неправильно.

Два формата для этой опции:

/path/to/sessions
N;/path/to/sessions

В целое число N определяет, сколько подкаталогов нужно создать по указанному пути, полезно для распределения файлов сеанса по множеству каталогов, если вы ожидаете много файлов сеанса. (Вы уже обнаружили, что системам не нравится много файлов в одном каталоге ...)

session.gc_probability = 0

Скорее всего, это основная проблема (если PHP автоматически не обработает некорректно установленное значение 0)

Вероятность того, что очистка произойдет, определяется следующим образом: probability/divisor. 0/1000 равно 0, поэтому, скорее всего, никогда не запустится.

Изменить: Что касается удаления файлов, возможно, вам просто придется дождаться его завершения. Если это миллионы файлов, может показаться, что он завис.

Вам нужно задание cron для очистки файлов сеанса, они не очищаются сами по себе. В Ubuntu / Debian есть скрипт (/etc/cron.d/php) для автоматической очистки.

Если такого скрипта у вас нет, поставьте find /var/www/data/sessions -cmin +1440 -print0 | xargs -0 -r rm на cronjob.

Он очистит файлы старше 24 часов.

Ваша конфигурация включает следующие настройки:

session.save_path = "N;/var/www/data/sessions"

что кажется неверным. Ведущий N в session.save_path должен быть целое число который определяет количество уровней подкаталогов, которые будут использоваться для распространения файлов сеанса.

Использование "N" (правильно или нет) также предотвратит сборку мусора в соответствии с руководством, и вам понадобится задание cron для удаления старых файлов сеансов:

У этой директивы есть необязательный аргумент N, который определяет количество уровней каталогов, на которых будут распространяться ваши файлы сеанса. Например, установка значения "5;/tmp" может закончиться созданием файла сеанса и местоположения, например /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174 . Чтобы использовать N вы должны создать все эти каталоги перед использованием. Для этого в ext / session существует небольшой сценарий оболочки, он называется mod_files.sh, а версия для Windows - mod_files.bat. Также обратите внимание, что если N используется и больше 0, тогда автоматическая сборка мусора НЕ будет выполнятьсясм. копию php.ini для получения дополнительной информации. Кроме того, если вы используете N, обязательно заключите session.save_path в «кавычки», потому что разделитель (;) также используется для комментариев в php.ini.