Утилита от @fazer для очистки upload.

855
Вашему вниманию предлагается утилита для очистки папки upload от неиспользуемых изображений.
Написана @fazer на языке PERL. Все благодарности и плюсы в карму сюда: @fazer
Так как @fazer не имеет пока достаточно кармы для своего блога, выкладываю эту разработку по его просьбе в своем блоге.
Благодаря использованию перла, поиск в базе теперь не приводит к падению сервера mysql на больших таблицах.

Утилита представляет из себя файл написанный на перле, который срабатывает по заданию планировщика или вручную из админки.
В настройках компонента можно настроить расширения, которые будут удаляться, поля в базе, в которых будут искаться ссылки на картинки, папки в которых будет производиться поиск ненужных файлов и папки, которые
не участвуют в поиске.
Лишние файлы переносятся в папку /upload/deleted, которую можно очистить потом. Также при работе скрипта создается лог удаляемых файлов cleaner_files.txt в папке upload.

По просьбе @fazer я прикрутил к его скрипту настройки и оформил всё это в виде компонента для установки.
После установки компонента нужно перейти в Панель управления - Компоненты - Очистка upload и настроить компонент.
Утилита  от @fazer для очистки upload.
После этого нужно перейти в Настройки - Планировщик и настроить время запуска задания планировщика "Очистка upload".
Утилита  от @fazer для очистки upload.
Если хочется сразу проверить работоспособность компонента - можно запустить это задание вручную.

ВНИМАНИЕ!

Если Вы не знаете, что настраивать в компоненте - просьба не скачивать и не устанавливать этот компонент, он Вам не нужен.
Работает только под линуксом, на опенсервере не хватает библиотек.
Для работы компонента требуется установленные на сервере библиотеки perl
libdbi libdbd-mysql DB_File
устанавливаются в зависимости от оп.системы хостинга
yum install perl-DBI perl-DBD-MySQL perl-DB_File
или
apt-get install libdbi-perl libdbd-mysql-perl
Мне помогло под вестой вот это:
yum install perl-DB_File

Скачать компонент "Очистка upload"

Свежая версия

Компонент для манипуляции фильтрацией и сортировкой в датасетах.
Комментарии (24)
Андрей 4 октября 2019 в 13:54 +1
Добрый день Ris - правильно понимаю, что это взамен Компонента "Поиск неиспользуемых изображений" http://joxi.ru/DmBwKb5uJG6vl2
Если да, то как корректно удалить его, чтобы поставить новый? Спасибо.
Ris 4 октября 2019 в 21:52 +2
Оно не мешает.
Если не знаете как удалить - просто не трогайте.
Андрей 4 октября 2019 в 22:01 +1
Я понял, спасибо. Да, и "Поиск неиспользуемых изображений" еще папки пустые удаляет.
Ris 4 октября 2019 в 22:02 +2
И эта утилита тоже удаляет.
Андрей 4 октября 2019 в 22:04 +1
Круто! smile
sindoyun 4 октября 2019 в 14:14 +1
При включенном компоненте, сайт не работает(белый экран)!
Ris 4 октября 2019 в 14:47 +1
А не сможете включить отладку и посмотреть, что за ошибка?
Artamos 5 октября 2019 в 02:03 +2
Проблема аналогичная - белый экран, вот ошибка:
Notice: Undefined offset: 0 in /var/www/user/data/www/site.ru/system/controllers/content/widgets/list/widget.php on line 108
Notice: Undefined offset: 1 in /var/www/user/data/www/site.ru/system/controllers/content/widgets/list/widget.php on line 108
Fatal error: Uncaught Error: Call to a member function limit() on null in /var/www/user/data/www/site.ru/system/controllers/content/widgets/list/widget.php:112 Stack trace: #0 /var/www/user/data/www/site.ru/system/core/core.php(906): widgetContentList->run() #1 /var/www/user/data/www/site.ru/system/core/core.php(867): cmsCore->runWidget(Array) #2 /var/www/user/data/www/site.ru/index.php(49): cmsCore->runWidgets() #3 {main} thrown in /var/www/user/data/www/site.ru/system/controllers/content/widgets/list/widget.php on line 112

При отключении компонента сайт работает нормально.

Еще бы при проверке статистику на почту или в лс отправлял, какие файлы и папки удалены, а то непонятно, делает что-то или нет.
@fazer 5 октября 2019 в 08:22 +1
Artamos:
Еще бы при проверке статистику на почту или в лс отправлял, какие файлы и папки удалены, а то непонятно, делает что-то или нет
К сожалению - это вряд ли, проблема в том что на больших базах cron не дождется(несколько минут) окончания работы очистителя.
Вы можете создать другое задание cron которое(например через час после очистителя) отправит вам на почту логи:
cleaner_dirs.txt, cleaner_errors.txt, cleaner_files.txt... ну или смотрите их непосредственно на сайте
http://www.site.ru/upload/cleaner_files.txt
Ris 5 октября 2019 в 10:27 +1
Да, моя недоработка.
Исправил, файл перезалил.
Просто скачайте еще раз и установите заново.
Ris 5 октября 2019 в 11:15 +1
Перезалил компонент.
Кто не хочет устанавливать заново - удалите файл /system/controllers/cleaner/manifest.php и обновите события в админке.
vikont 5 октября 2019 в 11:31 +2
Круто! А звучит то как "Утилита для очистки upload от @fazer."!
А можно вместо @fazer от кого то другого очищать папку upload?
Хотя тоже вопрос:"А что @fazer делает в папке...?" rofl

ПС.:Это конечно шутка. Компонент очень нужен и такими темпами его развития, скоро очутится в коробке! Где ему и место! Не хватает только защиты от дурака.
Ris 5 октября 2019 в 11:44 +1
Исправил.
@fazer 5 октября 2019 в 17:18 +1
скоро очутится в коробке
это тоже - вряд ли, разработчики не пойдут на усложнения из-за установки дополнительных не нативных для cms модулей )
защиты от дурака
некое подобие это testmode=on по умолчанию...
какой бы вы могли предложить доп алгоритм от криворуких ? :)
Rainbow 5 октября 2019 в 12:47 +2
Пока некогда потестить, но однозначно Молодцы! Спасибо!
Похоже все таки можно будет довести процедуру очистки до "без танцев с бубном".)
@noname 5 октября 2019 в 13:11 +1
По поводу сортировки файлов в upload еще не придумали что-нибудь ?
vikont 5 октября 2019 в 13:43 +1
А что тут можно придумать? Либо файлы сортируются изначально (следуя заложенной структуре) либо никак.
Ris 5 октября 2019 в 20:27 +2
Есть еще одна мысль (и я её думаю), что можно вместе со ссылкой на картинку получать из базы user_id.
Тогда резко сужается поиск возможного нахождения файла картинки.
Логическая цепочка такая:
Неиспользуемые файлы образуются двумя способами:
1. Добавление картинки без добавления ссылки в базу.
2. Изменение контента без корректного удаления изображений.
Отсюда мораль: если ссылка на картинку сопоставлена с user_id = 304, значит сама картинка должна лежать в папке /upload/003/u304/ и именно там её и следует искать, а не шариться по всему upload.
@fazer 6 октября 2019 в 12:03 +1
Тогда резко сужается поиск возможного нахождения файла картинки.
И это - вряд ли smile (что то я тут тока обламываю всех, прям как "fazer из upload" :)))
в базе если есть упоминание картинки то поиск по id user уже ни к чему, мы не ищем в аплоад по ссылкам, мы сравниваем имена катринок с наличием имени в базе...,
опять же, аплоад рекурсивно проходится - дольше выяснять чья это картинка чем сравнить её имя с наличием его(имени) в базе
SALIK 12 октября 2019 в 22:42 +1
У меня БД 2 гб, файлов примерно 600 тыс. - 700 тыс. Будет ли перегруз при запуске вашей утилиты и примерно как долго она будет искать?
Ris 12 октября 2019 в 23:05 +2
У меня база гиг. Практически всё в cms_comments. Файлов 3 гига.
Никто не затыкается и дорабатывает до конца.
Если при ручном запуске апач выдает ошибку - просто подождите минут 10. Оно работает в фоне.
SALIK 13 октября 2019 в 22:24 +1
Спасибо за инфу ;)
SALIK 13 октября 2019 в 22:24 +1
А вес у меня гигов 50..)) Ну ладно поэкспериментирую))
Ris 13 октября 2019 в 22:30 +2
50 гигов аплоуда или 50 гигов бызы?
В любом случае, помолимся за успех предприятия!