====== Проблема с удалением 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}}