Отслеживание ссылок или ссылок на файлы изображений и удаление неиспользуемых (PHP / База данных) - PullRequest
3 голосов
/ 08 июня 2010

Мне нужен способ удалить «неиспользуемые» изображения из моей файловой системы, то есть изображения, к которым никогда не осуществляется доступ из любой точки моего веб-сайта (не имеет значения, если я нарушу внешние ссылки. Я могу отключить внешние хотлинкинг вообще). Какой лучший способ сделать это? Обычные пользователи могут добавлять несколько вложений к темам / сообщениям, а авторы контента могут загружать большое количество изображений, которые можно использовать в статьях или галереях изображений.

Проблема в том, что на изображения можно ссылаться любым из следующих способов:

  1. Из пользовательского контента (text / html, возможно Markdown или BBCode), хранящегося в базе данных
  2. Закодировано в HTML-страницу
  3. Закодировано в файл PHP
  4. Закодировано в файл CSS
  5. В качестве поля «вложения» в таблице базы данных, обычно содержащего только само имя файла без пути, потому что приложение предполагает, что оно будет в определенной папке.

И в довершение всего, путь к изображению может быть абсолютным или относительным путем HTTP или PHP и может быть или не быть построен с конкатенацией строк в PHP.

Так что, очевидно, что найти / заменить или пересмотреть базу данных или файловую систему не может быть и речи. Но, к счастью для нас с вами, эта система еще не полностью реализована, и мне не нужно ничего, что касалось бы существующего запаса изображений. Мне просто нужно создать эффективную структуру, которая позволит это в будущем.

Некоторые идеи, о которых я подумал:

  • Перехват HTTP-запроса изображения с помощью PHP и отслеживание HTTP_REFERER. Проблема в том, что если во время проверки никто не нажимал на ссылку, это не означает, что ссылка не существует.
  • Использовать экстремальную нормализацию базы данных - то есть создать таблицу для изображений и использовать внешние ключи для всего, что ссылается на нее. Однако это привело бы к созданию метрической основы отношений многих ко многим (и кросс-таблиц) в дополнение к непрактичности для любого обычного пользователя.
  • Сделайте резервную копию всех изображений и удалите их, а также проверяйте каждый запрос 404 и каждый раз запускайте сценарий, который пытается найти изображение из резервной папки и помещает его в «настоящую» папку. Проблема заключается в том, что этот кэш придется очищать время от времени, а сервер может быть перегружен при перестройке кеша.

Идеи / предложения? Это просто то, что вы должны игнорировать и жить, даже если вы делаете сайт со смешным количеством изображений? Даже если это того не стоит, как что-то будет работать только для проверки концепции (я добавил тег сборки мусора только потому, что это может войти в эту область концептуально).

1 Ответ

1 голос
/ 08 июня 2010

Я признаю, что мой опыт с этим был проще, чем ваш.У меня не было, так сказать, «пользовательского контента», и все мои изображения были только в шаблонах или базе данных с полным путем.Но я создал скрипт на Perl, который

  • Проанализировал мои HTML-шаблоны, таблицу базы данных и CSS сгенерировал список файлов
    • В HTML он искал теги <img>
    • В CSS он искал любые строки регулярных выражений .png, .jp * g или .gif
    • Таблицы были просты, потому что у меня была таблица изображений для данных изображения
  • Затем в списке файлов было приказано удалить дубликаты
  • Сценарий прошел итерацию по списку и записал в формате csv: имя файла, (имя файла CSS | имя файла HTML | DBTABLE), (существует |notexists) для аудита
  • В другой итерации он переименовал все файлы, отсутствующие в списке, добавив .del к имени файла
  • После регрессионного тестирования я вызвал скрипт с тегом -docleanup, который сказал ему:пройти и удалить все добавленные файлы .del.
  • Если по какой-либо причине изображение было помечено как .del и не должно было быть, я просто вручную переименовал его в исходную форму.

Пара замечаний: IПонимаю, что я мог бы сделать этот сценарий «более плавным» и выполнять несколько действий в несколько этапов, но его использование со временем росло, и я хотел четко разграничить этапы обработки, чтобы он никогда не мог выйти из-под контроля.Я использовал CSV, чтобы вернуться и очистить информацию, где изображение не существует.

...