В продолжение темы про удаление пустых папок, сделал утилиту для глобальной очистки папки upload.
Запускается из админки.
1. Сканирует в полях всех таблиц базы (имена нужных полей можно добавлять через запятую в опциях) все ссылки на файлы изображений и записывает результат в файл /upload/links.json.
2. Сканирует файлы в папке upload и записывает результаты в файл /upload/files.json
3. Преобразует оба файла в массивы, сравнивает второй с первым и заносит результат в файл /upload/compare.json
4. Снова сканирует папку upload и файлы, совпадающие именами с содержимым /upload/compare.json, переносит с сохранением подпапок и путей в папку /deleted/upload/
5. Бонусом (если поставить галку) удаляет пустые папки и в upload и в deleted.
6. Пакует папку deleted в zip и вывешивает ссылку на скачивание.
Выглядит все это так:
По идее начинать нужно сначала и на следующий пункт перейдет автоматически, но если что-то пошло не так (не хватило времени, памяти и т.д.), всегда можно продолжить, перейдя на следующий пункт принудительно.
Все файлы при должном умении можно вернуть назад. Просто перенести или скопировать /deleted/upload/ в /upload/
Работает долго и нудно. Чем больше сайт, тем больше риск, что не хватит памяти.
Установка обычным способом.
Обновлено 03.07.2019
Изменена корневая папка сканирования с /upload на /upload/000
Скачать компонент unfinder с сайта instantcms.ru
Скачать компонент unfinder с яндексдиска
Запускается из админки.
1. Сканирует в полях всех таблиц базы (имена нужных полей можно добавлять через запятую в опциях) все ссылки на файлы изображений и записывает результат в файл /upload/links.json.
2. Сканирует файлы в папке upload и записывает результаты в файл /upload/files.json
3. Преобразует оба файла в массивы, сравнивает второй с первым и заносит результат в файл /upload/compare.json
4. Снова сканирует папку upload и файлы, совпадающие именами с содержимым /upload/compare.json, переносит с сохранением подпапок и путей в папку /deleted/upload/
5. Бонусом (если поставить галку) удаляет пустые папки и в upload и в deleted.
6. Пакует папку deleted в zip и вывешивает ссылку на скачивание.
Выглядит все это так:


По идее начинать нужно сначала и на следующий пункт перейдет автоматически, но если что-то пошло не так (не хватило времени, памяти и т.д.), всегда можно продолжить, перейдя на следующий пункт принудительно.
Если Вы не знаете, как на сервере перемещать файлы и в каких полях у Вас есть ссылки на изображения — лучше ничего не трогайте и не устанавливайте это!
Компонент предоставляется "как есть" и претензии по пропавшим фотографиям любимой собачки не принимаются.Все файлы при должном умении можно вернуть назад. Просто перенести или скопировать /deleted/upload/ в /upload/
Работает долго и нудно. Чем больше сайт, тем больше риск, что не хватит памяти.
Установка обычным способом.
Обновлено 03.07.2019
Изменена корневая папка сканирования с /upload на /upload/000
Скачать компонент unfinder с сайта instantcms.ru
Скачать компонент unfinder с яндексдиска
На тестовом, убрал треть мусора из upload было 150 Мб стало 97 Мб. Выберу время буду пробовать на реальном.
Тот по хрону срабатывает каждую ночь, а этот вручную, когда захочется..
Обязательно воспользуюсь после тестов на локалке.
2) Вопрос по нагрузкам планируете решать? как быть если картинок и записей в таблицах по нескольку миллионов?
2. Загружали картинку, что то пошло не так, в тексте не появилась и грузите заново, а предыдущая осталась, да еще расрирожированная по пресетам
3. Была одна картинка, потом решили заменить, а старая не удаляется!
4. Разные хвосты от дополнений и от удаленного контента.
У меня за 2,5 года накопилось 20000 мусорных картинок! Ориентировочный вес около 1 гб...
И это при условии, что большая часть картинок были оптимизированы!
А я то думаю чо ни так ... почему удаляют ... а тут вон оно чо
Протестируют люди дополнение, выскажут свое мнение, выявят все нюансы - устраню недостатки и выложу дополнение в каталог.
При переносе файлов сайт ушёл в ошибку 503 и висел долго-долго, и с главной страницы было не зайти - тоже 503, пока я через SSH доступ не снял задачу переноса файлов.
Но в защиту программы скажу, что и удалённых файлов получилось в уже упакованном архиве 1,5 Гб, понятно, что сложно на виртуальном хостинге такую громаду ворочать.
Но после того как снял ошибку, увидел, что задача выполнена.
При архивации у меня тоже уходит в 503, но при этом задача архивации выполняется.
Автор очень мне помог, потому что я смог уменьшить размер пространства у хостера и платить меньше на 4 рубля в день!
Можно было не убивать задачу, а просто подождать.
Бекапы при таких операциях просто необходимая вещь.
Вы операцию сканирования базы прервали. Соответственно оно не проверило все поля и не занесло картинки в список используемых.
Соответственно сочло неиспользуемыми и перенесло.
Как вернуть - написано в теме поста.
Просто прежде чем паниковать, сначала можно было почитать, прикинуть...
Это, кстати, всех аварийных случаев в жизни касается.
Чудес в этом компоненте нет никаких. Собственным интеллектом он не обладает. Ищет текст типа "abc123dfg.jpg" в полях, которые ему указали.
И в типы файлов я добавил расширение для картинок svg.
Для комментариев добавить content_html
Для обложек групп - cover
Для вложений нью-мессенжера - info
.......
А чтобы при этом сайт не завис наглухо, после каждой таблицы делать перерывчик на перекур?
А то сейчас пытаюсь найти и составить список полей с картинками, утомительное это дело. И наверняка что-нибудь все-равно упущу.
И потом этот список надо будет постоянно обновлять при установке или удалении компонентов и полей в типах контента.
Или хотя бы в форме, поле с полями (простите за тавтологию) сделать текстовым а не строковым. Список будет удобнее делать.
А остальные сканировать на предмет картинок?
Может быть просто надо приноровится, смотреть вначале на тестовом, что именно снесет на конкретном сайте,
все это куда то записывать, что бы не забыть.
Не каждый же день чистить...
Я пробовал. Ели количество строк в таблице > 10000 - выплевывать в аякс лимит, а промежуточный результат сохранять в джейсон, а потом мержить с остальными. Что-то такая навороченная катавасия получилась, что отказался от этой затеи...
Каждый тип контента создает свою папку, а в ней уже подпапки.
Если задавать сканировать только определенные подпапки, это позволит выбирать тип контента,
За один проход - один, за второй - другой и т.д.
Уже будет как то разделено. Не знаю как там в коде усложнит, но в настройках не сильно.
А у кого сайты не большие, можно и все сразу...
Тут единственный вариант, если в сканируемой таблице много строк - делать цикл на яваскрипте.
Но так как в яваскрипте я некопенгаген, то требуется помощь компетентных людей, а её нету.
Для этого можно создать класс-контейнер в котором будут только данные, это те переменные, массивы, что вы используете
при работе утилиты.
Выполнили определённый объём, объект класса-контейнера(дамп состояния) сохранили в файл. Далее header('Location: утилита');
В утилите первым делом восстанавливаете из файла объект класса-контейнера и продолжаете с нужной точки.
Код ваш не смотрел, так что это только теория.
Единственный выход - цикл на яваскрипте.
А уж как сохранять результаты итераций этого цикла - дело десятое.
На самом деле я не очень понял, как этот код применить.
Вот в этом дополнении есть в файле \system\controllers\unfinder\backend.php есть функция getLinks()
Там есть такой код:
Я уже сделал цикл на яваскрипте для выборки из больших таблиц. И поиск ссылок на картинки во всех таблицах и полях базы сделал.
Сейчас допиливаю...
Я смотрел документацию и подумал, что, exit() как раз и может запустить процесс очистки памяти перед очередной итерацией.
Если у вас получается с JS, то, извините, зря отвлёк.
А у меня в постах и комментариях.
Суть в следующем: некоторые картинки, находящиеся в папке upload прописаны только в конфиге шаблона. Судя по вопросу, который получил недавно в личке, они тоже удаляются.
Если не грузилась из админки (в настройках темы), - то в стилевом файле назначанного скина, а если грузилась, то - в options.css.php (последний подхватывает из system\config\theme_tseso.yml)
Всегда что то забудешь, а порой и не знаешь что такое поле есть!
У меня в компоненте Ротатор баннеров, нашлись картинки в поле file - не знал!
А так же сам наплодил поля photos2 - photos4
Что еще не учел трудно сказать, все как бы нормально, но вдруг натыкаешься на отсутствие фотографий....
Учитывая большую массу файлов, все это время...
При попытке сканирования память заполняется мгновенно.
Сможете сделать пример, как выплюнуть данные в браузер, сменить лимит офсет и с новым лимитом запустить скрипт в бэкэнде?
Есть база данных с несколькими миллионами записей.
Даже пробовать не буду там запускать)
А по сути вещь очень нужная.
Если никто не подскажет - придется делать фронтенд и экшенз. Там я знаю как функцию вызвать.
1. триггер в мускуле сканирует в полях всех таблиц базы (имена нужных полей можно добавлять через запятую в опциях) все ссылки на файлы изображений и записывает результат в таблицу links
2. Сканирует файлы в папке upload и записывает результаты в таблицу upload в базе
3. триггер в мускуле сравнивает таблицу links и таблицу upload и заносит результат в таблицу compare
4. дальше переносит, пакует, удаляет или что там ещё делает.
Ну конечно при условии того что триггеры в мускуле нормально реализованы.
Все равно, где хранить результаты сканирования, в базе, в переменной, в файле. Затык происходит на стадии выборки из таблицы с большим количеством строк.
$this->model->db->getRows($co['TABLE_NAME'], "{$co['COLUMN_NAME']} REGEXP 'jpg|gif|png'));
Тут нужно, если в таблице больше, к примеру, 10000 строк - отправлять выборку в цикл с limit $x * 10000, 10000. Соответственно $x при каждой итерации меняется.
Все поля таблиц базы, сканируются на предмет строк с наличием текста типа .jpg, .gif, .png и т.д. и подсчитывается количество строк с наличием такого текста.
Все таблицы и поля, в которых меньше 15000 строк с картинками заносятся в файл columns.json, а те, в которых больше - в файл big_columns.json.
Это уже реализовано.
Теперь нужно после сканирования таблиц, которые в columns.json, запустить цикл именно на яваскрипте (чтобы память между итерациями очищалась) и просканировать таблицы и поля, которые в big_columns.json, причем по частям с переключением лимита на выборку, чтобы память не переполнялась.
И вот ни как запустить яваскрипт из php, ни как обратиться к функции php из яваскрипта, я не очень представляю...
Но просто трындец, как долго...
Я позволил себе немного изменить файл,
.\system\controllers\unfinder\backend.php
теперь корректно определяет директории для чистки
стр.127 было :
Попробуйте здесь скачать:
https://yadi.sk/d/w4TP5a5a3WZNKE
Всем Добра и Мира!
Здравствуйте Уважаемый Ris, подскажите где скачать вашу разработку, работает ли с версией 2.15.2?
Очень хочется...
Спасибо Вам за труды..
Доработал утилиту следующим образом:
1. Поиск полей, в которых ищем ссылки доработан. Сначала находим поля типа text, mediumtext и т.д. В них ищутся ссылки по регулярке /цифры/uцыфры.любые символы/любые символы.(jpg|jpeg|JPG|png|bmp|gif|webp)
2. Сами файлы в папке upload ищутся только в папках с цифрами по регулярке /цифры/uцыфры.любые символы/любые символы.(jpg|jpeg|JPG|png|bmp|gif|webp).
Скачать:
instantcms.ru/redirect?url=https%3A%2F%2Fdisk.yandex.ru%2Fd%2F99rihwE8mUQQmA
Установка стандартным способом.
СПАСИБО ВАМ..
С Уважением..
Подскажите у меня выглядит все так:\
А картинки он удаляет??
Так как 1, 2, 3 у меня пролетает мигом, Перенести файлы и Скачать, там нужен выбор..
Но при этом же как бы возможно… Ни чего..
Только файлы deleted.zip
Где можно почитать Инструкцию :-))
Прочтите описание к этой утилите (вверху страницы), что делается на этих шагах...
Обычно я нажимаю пункты 1, 2, 3 с паузами, что бы если изображений много, всё посчиталось и нагрузка на сервер была меньше (возможно делаю это зря))...
Переносите найденные не нужные файлы… они пакуются в отдельную папку в корне сайта deleted.zip...
выбор сделан для того, что бы могли при необходимости скачать удаляемые файлы, для резервной копии...
Если пойдет что то не так можно из этой копии перезалить файлы опять в upload (структура папок сохраняется)...
После того, как проверите, что всё нормально на сайте, папку deleted.zip, можно удалить по FTP...
ЗЫ: мне уже известно, что чистильщик удаляет лишнего с моего сайта (ватермарк, лого к RSS, иконки к PWA и т.д.) таких не много, но всё таки есть, поэтому после чистки уже есть наготове эти изображения, быстро их восстанавливаю...
И да… рекомендую сразу после чистки, чистить кэш браузера, что бы увидеть, какие «лишние» изображения удалились с сайта… иначе у меня по началу неделю без ватермарка сайт был пока я не обнаружил, что ватермарк слетел с чисткой))...
🤣🤣🤣 Как раз сегодня это заметил!
На Openserver на тестовом сайте утилита отработала отлично: в Upload было 13,1 Gb — осталось 11,6, т.е. на полтора гига сайт стал легче! )
Однако, отработал практически автоматом, опции «Настройки» после установки компонента нет:
Ну, хотя бы после каждой операции в полосе сохранения сообщает какие-то данные: сколько таблиц, сколько найдено папок и картинок, сколько удалено. Потери — только логотип сайта, в остальном, при беглом осмотре, все на месте.
На рабочем сайте отработал. Правда, сначала на первой операции в ошибку 500 выбивало, пришлось увеличить лимит памяти до 512 Gb. Минус 2 гига мусора как с куста! Еще лишних полгодика на этом тарифе посижу! )