TorrentPier 3.0: новая система вложений

Exile

Administrator
Привет.

Продолжаем серию статей о том, что появится в новой мажорной версии проекта.

Сегодня поговорим об одном из самых масштабных изменений - мы полностью переработали систему вложений, выкинув легаси-модуль attach_mod, доставшийся в наследство от phpBB2, и заменив его на простую и понятную архитектуру, привязанную напрямую к темам.

Что было​

Система вложений в TorrentPier была унаследована от phpBB Attachment Mod - отдельного модуля, который прикручивался к phpBB2 как дополнение. Это восемь таблиц в базе данных, куча самописной логики, огромные разделы в панели администрирования, и примерно 6500 строк кода, которые по факту обслуживают одну единственную задачу - прикрепить торрент-файл к теме.

Проблем с этим подходом было несколько. Чтобы получить информацию о торренте, нужно было делать JOIN через три таблицы: bb_topicsbb_postsbb_attachmentsbb_attachments_desc. Вложения привязывались к посту, а не к теме - а нам нужна привязка именно к теме, потому что торрент в TorrentPier это всегда свойство темы, а не отдельного сообщения.

Что стало​

В версии 3.0 торрент-файл привязан напрямую к теме через два новых поля в таблице bb_topics:
  • attach_ext_id — идентификатор расширения файла
  • attach_filesize — размер файла в байтах
Все. Никаких промежуточных таблиц, никаких JOIN'ов. Чтобы узнать есть ли у темы торрент - достаточно проверить одно поле. Путь к файлу вычисляется из topic_id, а не хранится в базе.

Что удалено​

Масштаб зачистки можно оценить по цифрам: ~6,500 строк удалено, ~2,700 строк добавлено. Чистое сокращение кодовой базы - почти 4,000 строк.

Удалены:
  • Вся директория library/attach_mod/ (7 файлов)
  • Несколько файлов админ-панели и их шаблоны
  • Легаси-классы Attach.php (865 строк), AttachPosting.php, Torrent.php (792 строки)
  • Билдер для кеша расширений build_attach_extensions.php
  • Крон attach_maintenance.php
  • Восемь таблиц базы данных
  • Система квот
  • Около 200 неиспользуемых языковых строк

Новые компоненты​

Вместо монолитного attach_mod появился набор компактных классов:

TorrentPier\Attachment - централизованное управление файлами вложений. Простые статические методы: store(), delete(), getPath(), getSize(), exists(). Ничего лишнего.
TorrentPier\Torrent\Registry - регистрация и снятие торрентов с трекера. Включает умную авто-регистрацию с поддержкой премодерации.
TorrentPier\Torrent\Sender — отдача торрент-файла пользователю с инъекцией passkey в announce-URL.
TorrentPier\Torrent\Moderation — действия модерации над торрентами (смена статуса, типа раздачи).
TorrentPier\Torrent\Passkey — генерация и валидация passkey.
TorrentPier\Torrent\DownloadCounter — трекинг скачиваний с дневными лимитами.
TorrentPier\Torrent\FileList — парсинг и отображение содержимого торрент-файла.

Каждый класс отвечает за свою задачу. Монолитный Torrent.php на 800 строк, где всё было свалено в кучу, ушел в прошлое.

Лимиты скачивания​

Появилась новая функциональность: настраиваемые дневные лимиты скачивания.

PHP:
$bb_cfg['torrent_dl'] = [
    'daily_limit' => 50,         // Обычные пользователи
    'daily_limit_premium' => 100, // Премиум-пользователи
];

Система отслеживает уникальные скачивания: если пользователь уже скачивал этот торрент — повторная загрузка не считается. Гости проходят без ограничений (скачивание без учета). Счетчики сбрасываются ежедневно через крон.

Миграция для существующих установок​

Для тех, кто обновляется с 2.x — мы подготовили скрипт миграции install/scripts/migrate_attachments.php, который:
  • Переносит данные из старых таблиц вложений в новые поля bb_topics
  • Сохраняет пути к торрент-файлам
  • Обновляет ссылки на статусы трекера
  • Поддерживает откат в случае проблем
После запуска скрипта достаточно выполнить миграции (php vendor/bin/phinx migrate), и все заработает на новой системе.

Улучшения TorrServer​

В рамках этой же работы мы оптимизировали интеграцию с TorrServer:
  • Добавлен метод isAvailable() с 30-секундным кешем — если TorrServer недоступен, движок не будет тратить время на таймауты
  • Таймаут по умолчанию уменьшен с 5 до 3 секунд
  • Используется упрощенный HTTP-клиент без retry middleware для быстрого отказа
  • Корректная деградация при недоступности TorrServer — интерфейс не ломается, просто не показывает элементы связанные с TorrServer

Изменения в конфигурации​

Удалены старые опции tracker.use_real_filename и tracker.use_old_torrent_name_format. Вместо них — одна простая настройка:
PHP:
$bb_cfg['tracker']['torrent_filename_with_title'] = true; // Включать ли название темы в имя файла

Конфигурация вложений стала тривиальной:
PHP:
$bb_cfg['attach'] = [
    'upload_path' => DATA_DIR . '/uploads',
    'max_size' => 5 * 1024 * 1024,
    'up_allowed' => true,
    'allowed_ext' => ['torrent'],
];

Что это дает​

  • Производительность. Один запрос вместо цепочки JOIN'ов через четыре таблицы
  • Простота. Шесть компактных классов вместо монолита на тысячи строк
  • Поддерживаемость. Каждый класс делает одно дело и делает его хорошо
  • Чистота. Минус 4,000 строк мертвого кода, который тащили с 2005 года

Что дальше​

Переработка системы вложений - одно из ключевых изменений версии 3.0. В следующих статьях расскажем о других нововведениях.
 
Back
Top