Exile
Administrator
Привет.
Продолжаем серию статей о том, что появится в новой мажорной версии проекта.
Сегодня поговорим об одном из самых масштабных изменений - мы полностью переработали систему вложений, выкинув легаси-модуль
Проблем с этим подходом было несколько. Чтобы получить информацию о торренте, нужно было делать JOIN через три таблицы:
Удалены:
Каждый класс отвечает за свою задачу. Монолитный
Система отслеживает уникальные скачивания: если пользователь уже скачивал этот торрент — повторная загрузка не считается. Гости проходят без ограничений (скачивание без учета). Счетчики сбрасываются ежедневно через крон.
Конфигурация вложений стала тривиальной:
Продолжаем серию статей о том, что появится в новой мажорной версии проекта.
Сегодня поговорим об одном из самых масштабных изменений - мы полностью переработали систему вложений, выкинув легаси-модуль
attach_mod, доставшийся в наследство от phpBB2, и заменив его на простую и понятную архитектуру, привязанную напрямую к темам.Что было
Система вложений в TorrentPier была унаследована от phpBB Attachment Mod - отдельного модуля, который прикручивался к phpBB2 как дополнение. Это восемь таблиц в базе данных, куча самописной логики, огромные разделы в панели администрирования, и примерно 6500 строк кода, которые по факту обслуживают одну единственную задачу - прикрепить торрент-файл к теме.Проблем с этим подходом было несколько. Чтобы получить информацию о торренте, нужно было делать JOIN через три таблицы:
bb_topics → bb_posts → bb_attachments → bb_attachments_desc. Вложения привязывались к посту, а не к теме - а нам нужна привязка именно к теме, потому что торрент в TorrentPier это всегда свойство темы, а не отдельного сообщения.Что стало
В версии 3.0 торрент-файл привязан напрямую к теме через два новых поля в таблице bb_topics:attach_ext_id— идентификатор расширения файлаattach_filesize— размер файла в байтах
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 года