====== Проблема с удалением PHP сессий ======
{{ :web:cleanup.png?nolink|}}
Описание проблемы:
* [[http://phpsuxx.blogspot.ru/2010/09/ispmanager-debian-php-mod-tmpbin-tmp.html|ISPManager + Debian + PHP + виртуальный хостинг = мириады файлов в папке mod-tmp/bin-tmp]]
* [[http://forum.ispsystem.com/ru/showthread.php?t=7409|Проблема с удалением сессий]]
Удалить сотни-тысячи-миллионы файлов в каталоге:
* [[http://pc-freak.net/blog/how-to-delete-million-of-files-on-busy-linux-servers-work-out-argument-list-too-long/|How to delete million of files on busy Linux servers (Work out Argument list too long)]]
* [[http://stackoverflow.com/questions/9205796/can-i-safely-delete-all-content-in-var-lib-php5|Can I safely delete all content in /var/lib/php5?]]
* [[http://www.dp76.com/log/579|rm: Argument list too long]]
* http://golinux.com.ua/debian/ochistka-sessiy-ispmanager-debian.html
Документация PHP.NET
* [[http://www.php.net/manual/en/session.configuration.php|Session configuration options]] | [[http://www.php.net/manual/ru/session.configuration.php|Опции настройки механизма сессий]]
* [[http://www.php.net/manual/en/ref.session.php|Session Functions]]
Что настроить, чтобы такого не было:
* [[http://www.php.net/manual/ru/session.configuration.php#ini.session.gc-probability|session.gc_probability]]
* [[http://www.php.net/manual/ru/session.configuration.php#ini.session.gc-divisor|session.gc_divisor]]
* [[http://www.php.net/manual/ru/session.configuration.php#ini.session.gc-maxlifetime|session.gc_maxlifetime]]
Пример
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
UPDATE
Посмотреть количество файлов в mod-tmp
ls -R /var/www/*/data/mod-tmp | wc -l
ls -R /var/www/*/data/bin-tmp | wc -l
Удалить
find /var/www/*/data/mod-tmp -name "sess_*" -type f -exec rm {} \;
find /var/www/*/data/bin-tmp -name "sess_*" -type f -exec rm {} \;
Если файлов очень много, то появится ошибка **find: cannot fork: Cannot allocate memory**.
Новый вариант с nice ([[http://searchengines.guru/showthread.php?t=932682|searchengines]])
nice -n 19 ionice -c3 find /var/www/user1/data/mod-tmp/ -maxdepth 1 -type f -name sess* | xargs -n1 nice -n 19 ionice -c3 rm
Ещё один вариант
cd /root/
mkdir empty_dir
rsync -a --delete /root/empty_dir/ /var/www/user1/data/mod-tmp/
tmpwatch/tmpreaper + ionice.
The tmpwatch utility recursively searches through specified directories and removes files which have not been accessed in a specified period of time. Tmpwatch is normally used to clean up directories which are used for temporarily holding files (for example, /tmp). Tmpwatch ignores symlinks, won't switch filesystems and only removes empty directories and regular files.
Поискав более изящные решения нашёл интересные ссылки
* https://eurohoster.org/blog/administration/full/19
* https://eurohoster.org/blog/administration/full/117
* http://seriyps.ru/blog/2012/11/03/how-to-remove-millions-of-files-from-single-directory/
UPD май-2021 - [[https://www.getpagespeed.com/server-setup/php/cleanup-php-sessions-like-a-pro|Cleanup PHP Sessions like a PRO]]
Пример GC для разных сайтов
/usr/bin/php -d session.save_path=/srv/www/foo.example.com/sessions \
-d session.gc_probability=1 \
-d session.gc_divisor=1 \
-d session.gc_maxlifetime=86400 \
-r "session_start(); session_destroy();"
/usr/bin/php -d session.save_path=/srv/www/bar.example.com/sessions \
-d session.gc_probability=1 \
-d session.gc_divisor=1 \
-d session.gc_maxlifetime=3600 \
-r "session_start(); session_destroy();"
9,39 * * * * /usr/bin/php -d session.save_path=/srv/www/foo.example.com/sessions -d session.gc_probability=1 -d session.gc_divisor=1 -d session.gc_maxlifetime=86400 -r "session_start(); session_destroy();"
19,49 * * * * /usr/bin/php -d session.save_path=/srv/www/bar.example.com/sessions -d session.gc_probability=1 -d session.gc_divisor=1 -d session.gc_maxlifetime=3600 -r "session_start(); session_destroy();"
{{tag>linux php mod-tmp}}