- Совместимость с XenForo
- 2.3
- Видимый копирайт
- Нет
Проверка целостности вложений.
Если файл вложения отсутствует, но соответствующая строка в базе данных сохранилась, XenForo всё равно отображает ссылку на вложение. При нажатии на неё возникает ошибка 500, и в журнал ошибок записываются следующие данные:
Встроенного способа поиска таких файлов в пакетном режиме нет, и невозможно отличить действительно потерянное вложение от файла, который всё ещё хранится в хранилище под устаревшим ключом.
Это происходит после восстановления базы данных, миграции хранилища, неудачной синхронизации S3/R2, частично восстановленной резервной копии или просто после многолетних неудачных попыток удаления.
Что это делает?
Каждое вложение классифицируется как одно из трёх:
Проверка MD5 имеет значение. Перелинковка только по имени файла приведет к тому, что скриншот от постороннего человека будет прикреплен к чьему-то сообщению.
Три режима.
Инструкция по использованию:
Поместите скрипт в корневую папку вашего форума, рядом с файлом index.php. Затем:
Это только для чтения и ничего не меняет. --index выполняет один рекурсивный список содержимого вашего хранилища и отвечает на каждый запрос из памяти — на удаленном хранилище это превращает ~200 000 сетевых запросов в ~200 вызовов списка.
Просмотрите CSV-файл. Затем сделайте резервную копию:
Восстановить без удаления чего-либо:
Исправьте и удалите "мертвые" строки:
Безопасность.
Этот инструмент может удалять строки из базы данных, поэтому он основан на предположении, что может давать неверные результаты.
Чего скрипт никогда не затрагивает: сообщения и ветки обсуждений не изменяются.
Если файл вложения отсутствует, но соответствующая строка в базе данных сохранилась, 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.
Чего скрипт никогда не затрагивает: сообщения и ветки обсуждений не изменяются.
