В продолжение темы про удаление пустых папок, сделал утилиту для глобальной очистки папки 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 с яндексдиска
Реклама #
RSN 6 лет назад #
На тестовом, убрал треть мусора из upload было 150 Мб стало 97 Мб. Выберу время буду пробовать на реальном.
Андрей 6 лет назад #
Ris 6 лет назад #
Тот по хрону срабатывает каждую ночь, а этот вручную, когда захочется..
Андрей 6 лет назад #
Zau4man 6 лет назад #
Обязательно воспользуюсь после тестов на локалке.
R161Net 6 лет назад #
Kreator 6 лет назад #
2) Вопрос по нагрузкам планируете решать? как быть если картинок и записей в таблицах по нескольку миллионов?
Ris 6 лет назад #
Def 6 лет назад #
vikont 6 лет назад #
2. Загружали картинку, что то пошло не так, в тексте не появилась и грузите заново, а предыдущая осталась, да еще расрирожированная по пресетам
3. Была одна картинка, потом решили заменить, а старая не удаляется!
4. Разные хвосты от дополнений и от удаленного контента.
У меня за 2,5 года накопилось 20000 мусорных картинок! Ориентировочный вес около 1 гб...
И это при условии, что большая часть картинок были оптимизированы!
WS38 6 лет назад #
ermakover 6 лет назад #
Kreator 6 лет назад #
А я то думаю чо ни так ... почему удаляют ... а тут вон оно чо
Ris 6 лет назад #
Протестируют люди дополнение, выскажут свое мнение, выявят все нюансы - устраню недостатки и выложу дополнение в каталог.
Андрей 6 лет назад #
Ris 6 лет назад #
IamB 6 лет назад #
ermakover 6 лет назад #
При переносе файлов сайт ушёл в ошибку 503 и висел долго-долго, и с главной страницы было не зайти - тоже 503, пока я через SSH доступ не снял задачу переноса файлов.
Но в защиту программы скажу, что и удалённых файлов получилось в уже упакованном архиве 1,5 Гб, понятно, что сложно на виртуальном хостинге такую громаду ворочать.
Но после того как снял ошибку, увидел, что задача выполнена.
При архивации у меня тоже уходит в 503, но при этом задача архивации выполняется.
Автор очень мне помог, потому что я смог уменьшить размер пространства у хостера и платить меньше на 4 рубля в день!
Ris 6 лет назад #
Можно было не убивать задачу, а просто подождать.
ermakover 6 лет назад #
ermakover 6 лет назад #
Андрей 6 лет назад #
ermakover 6 лет назад #
RSN 6 лет назад #
Бекапы при таких операциях просто необходимая вещь.
Ris 6 лет назад #
Вы операцию сканирования базы прервали. Соответственно оно не проверило все поля и не занесло картинки в список используемых.
Соответственно сочло неиспользуемыми и перенесло.
Как вернуть - написано в теме поста.
ermakover 6 лет назад #
Ris 6 лет назад #
Просто прежде чем паниковать, сначала можно было почитать, прикинуть...
Это, кстати, всех аварийных случаев в жизни касается.
Ris 6 лет назад #
Чудес в этом компоненте нет никаких. Собственным интеллектом он не обладает. Ищет текст типа "abc123dfg.jpg" в полях, которые ему указали.
Андрей 6 лет назад #
Ris 6 лет назад #
RSN 6 лет назад #
Ris 6 лет назад #
Pocus 6 лет назад #
Pocus 6 лет назад #
WS38 6 лет назад #
Андрей 6 лет назад #
И в типы файлов я добавил расширение для картинок svg.
Pocus 6 лет назад #
Для комментариев добавить content_html
Для обложек групп - cover
Для вложений нью-мессенжера - info
.......
Ris 6 лет назад #
Андрей 6 лет назад #
Андрей 6 лет назад #
Pocus 6 лет назад #
А чтобы при этом сайт не завис наглухо, после каждой таблицы делать перерывчик на перекур?
А то сейчас пытаюсь найти и составить список полей с картинками, утомительное это дело. И наверняка что-нибудь все-равно упущу.
И потом этот список надо будет постоянно обновлять при установке или удалении компонентов и полей в типах контента.
Или хотя бы в форме, поле с полями (простите за тавтологию) сделать текстовым а не строковым. Список будет удобнее делать.
Pocus 6 лет назад #
А остальные сканировать на предмет картинок?
RSN 6 лет назад #
Может быть просто надо приноровится, смотреть вначале на тестовом, что именно снесет на конкретном сайте,
все это куда то записывать, что бы не забыть.
Не каждый же день чистить...
Ris 6 лет назад #
Я пробовал. Ели количество строк в таблице > 10000 - выплевывать в аякс лимит, а промежуточный результат сохранять в джейсон, а потом мержить с остальными. Что-то такая навороченная катавасия получилась, что отказался от этой затеи...
RSN 6 лет назад #
Каждый тип контента создает свою папку, а в ней уже подпапки.
Если задавать сканировать только определенные подпапки, это позволит выбирать тип контента,
За один проход - один, за второй - другой и т.д.
Уже будет как то разделено. Не знаю как там в коде усложнит, но в настройках не сильно.
А у кого сайты не большие, можно и все сразу...
Ris 6 лет назад #
Тут единственный вариант, если в сканируемой таблице много строк - делать цикл на яваскрипте.
Но так как в яваскрипте я некопенгаген, то требуется помощь компетентных людей, а её нету.
IamB 6 лет назад #
Для этого можно создать класс-контейнер в котором будут только данные, это те переменные, массивы, что вы используете
при работе утилиты.
Выполнили определённый объём, объект класса-контейнера(дамп состояния) сохранили в файл. Далее header('Location: утилита');
В утилите первым делом восстанавливаете из файла объект класса-контейнера и продолжаете с нужной точки.
Код ваш не смотрел, так что это только теория.
IamB 6 лет назад #
Ris 6 лет назад #
Единственный выход - цикл на яваскрипте.
А уж как сохранять результаты итераций этого цикла - дело десятое.
IamB 6 лет назад #
IamB 6 лет назад #
Ris 6 лет назад #
На самом деле я не очень понял, как этот код применить.
Вот в этом дополнении есть в файле \system\controllers\unfinder\backend.php есть функция getLinks()
Там есть такой код:
Я уже сделал цикл на яваскрипте для выборки из больших таблиц. И поиск ссылок на картинки во всех таблицах и полях базы сделал.
Сейчас допиливаю...
IamB 6 лет назад #
Я смотрел документацию и подумал, что, exit() как раз и может запустить процесс очистки памяти перед очередной итерацией.
Если у вас получается с JS, то, извините, зря отвлёк.
vikont 6 лет назад #
Ris 6 лет назад #
А у меня в постах и комментариях.
Олег Васильевич я 6 лет назад #
Ris 6 лет назад #
Олег Васильевич я 6 лет назад #
Олег Васильевич я 6 лет назад #
Ris 6 лет назад #
vikont 6 лет назад #
Всегда что то забудешь, а порой и не знаешь что такое поле есть!
У меня в компоненте Ротатор баннеров, нашлись картинки в поле file - не знал!
А так же сам наплодил поля photos2 - photos4
Что еще не учел трудно сказать, все как бы нормально, но вдруг натыкаешься на отсутствие фотографий....
Учитывая большую массу файлов, все это время...
Ris 6 лет назад #
При попытке сканирования память заполняется мгновенно.
Kreator 6 лет назад #
Ris 6 лет назад #
Сможете сделать пример, как выплюнуть данные в браузер, сменить лимит офсет и с новым лимитом запустить скрипт в бэкэнде?
Kreator 6 лет назад #
Есть база данных с несколькими миллионами записей.
Даже пробовать не буду там запускать)
А по сути вещь очень нужная.
IamB 6 лет назад #
Ris 6 лет назад #
Если никто не подскажет - придется делать фронтенд и экшенз. Там я знаю как функцию вызвать.
eoleg 6 лет назад #
1. триггер в мускуле сканирует в полях всех таблиц базы (имена нужных полей можно добавлять через запятую в опциях) все ссылки на файлы изображений и записывает результат в таблицу links
2. Сканирует файлы в папке upload и записывает результаты в таблицу upload в базе
3. триггер в мускуле сравнивает таблицу links и таблицу upload и заносит результат в таблицу compare
4. дальше переносит, пакует, удаляет или что там ещё делает.
Ну конечно при условии того что триггеры в мускуле нормально реализованы.
eoleg 6 лет назад #
Ris 6 лет назад #
Все равно, где хранить результаты сканирования, в базе, в переменной, в файле. Затык происходит на стадии выборки из таблицы с большим количеством строк.
$this->model->db->getRows($co['TABLE_NAME'], "{$co['COLUMN_NAME']} REGEXP 'jpg|gif|png'));
Тут нужно, если в таблице больше, к примеру, 10000 строк - отправлять выборку в цикл с limit $x * 10000, 10000. Соответственно $x при каждой итерации меняется.
Старый балбес 6 лет назад #
Ris 6 лет назад #
Все поля таблиц базы, сканируются на предмет строк с наличием текста типа .jpg, .gif, .png и т.д. и подсчитывается количество строк с наличием такого текста.
Все таблицы и поля, в которых меньше 15000 строк с картинками заносятся в файл columns.json, а те, в которых больше - в файл big_columns.json.
Это уже реализовано.
Теперь нужно после сканирования таблиц, которые в columns.json, запустить цикл именно на яваскрипте (чтобы память между итерациями очищалась) и просканировать таблицы и поля, которые в big_columns.json, причем по частям с переключением лимита на выборку, чтобы память не переполнялась.
И вот ни как запустить яваскрипт из php, ни как обратиться к функции php из яваскрипта, я не очень представляю...
Pro AV 6 лет назад #
Pocus 6 лет назад #
Ris 6 лет назад #
Но просто трындец, как долго...
Pro AV 6 лет назад #
Pro AV 6 лет назад #
Я позволил себе немного изменить файл,
.\system\controllers\unfinder\backend.php
теперь корректно определяет директории для чистки
стр.127 было :
Xamle 6 лет назад #
Ris 6 лет назад #
Попробуйте здесь скачать:
https://yadi.sk/d/w4TP5a5a3WZNKE
R161Net 1 год назад #
Всем Добра и Мира!
Здравствуйте Уважаемый Ris, подскажите где скачать вашу разработку, работает ли с версией 2.15.2?
Очень хочется...
Спасибо Вам за труды..
Ris 1 год назад #
Доработал утилиту следующим образом:
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
Установка стандартным способом.
R161Net 1 год назад #
СПАСИБО ВАМ..
С Уважением..
R161Net 1 год назад #
Подскажите у меня выглядит все так:\
А картинки он удаляет??
Так как 1, 2, 3 у меня пролетает мигом, Перенести файлы и Скачать, там нужен выбор..
Но при этом же как бы возможно… Ни чего..
Только файлы deleted.zip
Где можно почитать Инструкцию :-))
RSN 1 год назад #
Прочтите описание к этой утилите (вверху страницы), что делается на этих шагах...
Обычно я нажимаю пункты 1, 2, 3 с паузами, что бы если изображений много, всё посчиталось и нагрузка на сервер была меньше (возможно делаю это зря))...
Переносите найденные не нужные файлы… они пакуются в отдельную папку в корне сайта deleted.zip...
выбор сделан для того, что бы могли при необходимости скачать удаляемые файлы, для резервной копии...
Если пойдет что то не так можно из этой копии перезалить файлы опять в upload (структура папок сохраняется)...
После того, как проверите, что всё нормально на сайте, папку deleted.zip, можно удалить по FTP...
ЗЫ: мне уже известно, что чистильщик удаляет лишнего с моего сайта (ватермарк, лого к RSS, иконки к PWA и т.д.) таких не много, но всё таки есть, поэтому после чистки уже есть наготове эти изображения, быстро их восстанавливаю...
И да… рекомендую сразу после чистки, чистить кэш браузера, что бы увидеть, какие «лишние» изображения удалились с сайта… иначе у меня по началу неделю без ватермарка сайт был пока я не обнаружил, что ватермарк слетел с чисткой))...
R161Net 1 год назад #
🤣🤣🤣 Как раз сегодня это заметил!
Викторыч 10 месяцев назад #
На Openserver на тестовом сайте утилита отработала отлично: в Upload было 13,1 Gb — осталось 11,6, т.е. на полтора гига сайт стал легче! )
Однако, отработал практически автоматом, опции «Настройки» после установки компонента нет:
Ну, хотя бы после каждой операции в полосе сохранения сообщает какие-то данные: сколько таблиц, сколько найдено папок и картинок, сколько удалено. Потери — только логотип сайта, в остальном, при беглом осмотре, все на месте.
Викторыч 10 месяцев назад #
На рабочем сайте отработал. Правда, сначала на первой операции в ошибку 500 выбивало, пришлось увеличить лимит памяти до 512 Gb. Минус 2 гига мусора как с куста! Еще лишних полгодика на этом тарифе посижу! )