Attachment Integrity Check (CLI)

Attachment Integrity Check (CLI) 2026-08-22

Нет прав для скачивания
Совместимость с XenForo
  1. 2.3
Видимый копирайт
Нет
Проверка целостности вложений.

Если файл вложения отсутствует, но соответствующая строка в базе данных сохранилась, XenForo всё равно отображает ссылку на вложение. При нажатии на неё возникает ошибка 500, и в журнал ошибок записываются следующие данные:

Код:
League\Flysystem\FileNotFoundException: File not found at path: attachments/236/236888-0dcb....data
src/XF/Pub/View/Attachment/View.php:27

Встроенного способа поиска таких файлов в пакетном режиме нет, и невозможно отличить действительно потерянное вложение от файла, который всё ещё хранится в хранилище под устаревшим ключом.

Это происходит после восстановления базы данных, миграции хранилища, неудачной синхронизации S3/R2, частично восстановленной резервной копии или просто после многолетних неудачных попыток удаления.

Что это делает?

Каждое вложение классифицируется как одно из трёх:

  • Хорошо — файл находится именно там, где его ожидает XenForo.
  • RELINK — файл отсутствует по ожидаемому пути, но файл с этим data_id существует под другим file_key , и его md5 совпадает с сохраненным file_hash . Загрузка прошла успешно; устарел только указатель на базу данных. Восстановимо без потери данных.
  • ОТСУТСТВУЕТ — файл отсутствует или существует кандидат, чей MD5-код не совпадает, что означает, что идентификатор был повторно использован при последующей загрузке, и этот файл принадлежит кому-то другому. Восстановить ничего невозможно.

Проверка MD5 имеет значение. Перелинковка только по имени файла приведет к тому, что скриншот от постороннего человека будет прикреплен к чьему-то сообщению.

Три режима.

  • Сканирование — выполняет обход базы данных с вопросом «где находится файл?» и записывает CSV-файл. Только для чтения.
  • «Сироты» — обратная операция. Обходит хранилище, спрашивая: «Какой строке принадлежит этот файл?», находя файлы, заблокированные в результате отката базы данных, которые обычное сканирование не может обнаружить, поскольку эти строки больше не существуют. Только для чтения.
  • Применить — обрабатывает CSV-файл сканирования, повторно проверяет каждую строку по данным хранилища, а затем исправляет ошибки. Удаляет только по вашему явному запросу.

Инструкция по использованию:

Поместите скрипт в корневую папку вашего форума, рядом с файлом index.php. Затем:

Код:
php xf-missing-attachments.php --index --report=scan.csv

Это только для чтения и ничего не меняет. --index выполняет один рекурсивный список содержимого вашего хранилища и отвечает на каждый запрос из памяти — на удаленном хранилище это превращает ~200 000 сетевых запросов в ~200 вызовов списка.

Просмотрите CSV-файл. Затем сделайте резервную копию:

Код:
mysqldump YOUR_DB xf_attachment xf_attachment_data > attach-backup.sql

Восстановить без удаления чего-либо:

Код:
php xf-missing-attachments.php --apply=scan.csv --index

Исправьте и удалите "мертвые" строки:

Код:
php xf-missing-attachments.php --apply=scan.csv --index --delete

Безопасность.

Этот инструмент может удалять строки из базы данных, поэтому он основан на предположении, что может давать неверные результаты.

  • Сканирование никогда не приводит к записи. Удаление требует отдельного запуска, отдельного флага и CSV-файла, который вы успели прочитать.
  • Перед каждым изменением каждая строка повторно проверяется по данным в актуальном хранилище. Устаревший или отредактированный вручную CSV-файл не может нанести ущерб.
  • Пустой индекс прерывается. Если хранилище недоступно или префикс указан неверно, каждая строка будет отображаться как ОТСУТСТВУЮЩАЯ. Это критическая ошибка, и параметр --force её не отменяет.
  • Защита от копирования. План, предусматривающий удаление более 20% всех вложений, отклоняется — такая ситуация означает сбой в хранилище, а не потерю данных.
  • Параметр Count guard. --max-delete (по умолчанию 2000) блокирует неожиданно большие планы выполнения.
  • Удаление происходит на уровне сущностей , поэтому параметр attach_count поддерживается собственным обработчиком вложений XenForo для каждого типа контента, включая контент из других дополнений.
  • Неизвестные аргументы отклоняются , а не игнорируются молча.
  • Отчеты нельзя записать в доступный через веб-интерфейс путь — в них отображаются все вложения на вашем форуме. Они отправляются в папку internal_data/attachment-audit/.
  • Отказывается работать по протоколу HTTP.

Чего скрипт никогда не затрагивает: сообщения и ветки обсуждений не изменяются.
Автор
inliadev
Скачивания
1
Просмотры
26
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя inliadev

  • [DD] Dice Roller
    [DD] Dice Roller
    Управляйте кубиками и системами, а затем бросайте их в посте.
  • [DD] New Post Icon
    [DD] New Post Icon
    Отображает значок перед темами с новыми сообщениями в каждом списке.
  • [DD] Prefix & Label Tools - add Icons and more
    [DD] Prefix & Label Tools - add Icons and more
    Оформите свои префиксы и баннеры пользователей, а также добавьте простые в настройке варианты с икон

Поделиться ресурсом

Назад
Сверху Снизу