№ 7268 В разделе
Programming
от May 31st, 2015,
В подшивках: PHP, Torrent
Я как-то уже писал торрент трекер для нашего опенсорс сообщества, но реализация была полностью на пхп и не отличалась особой скоростью. Поскольку мне понадобилось интегрировать поддержку торрентов в Distr CMS я начал искать пути ускорения работы с торрентами. На глаза попался офигенский модуль к php, который задачу парсинга берет на себя. А вот остальные функции все равно нужно писать самому.
Задача нулевая. Установка модуля.
Нужно поставить пакеты для сборки модуля sudo apt-get install php5-dev build-essential subversion
Далее получаем модуль и собираем его
svn checkout http://php-bencode-extension.googlecode.com/svn/trunk/ php-bencode
cd php-bencode
phpize
./configure --with-php-config="`whereis php-config|awk '{ print $2 }'`"
make
Теперь нужно скопировать модуль в директорию к остальным модулям. У меня это была директория /usr/lib/php5/20131226
. У вас будет что-нибудь похожее.
В конце нужно создать конфиг для загрузки модуля в память при старте php. У меня используется php-fpm, поэтому этот конфиг положил в /etc/php5/fpm/conf.d/cg_bcode.ini
Текст конфига
extension=cg_bcode.so
Модуль установлен, делаем рестарт php-fpm, apache или что у вас там.
Задача первая. Нужно посмотреть сидеров и личеров.
Установленый модуль добавляет функции bdecode и bencode, ускоряя обработку файлов в разы. Однако, это не отменяет необходимости кеширования этих значений при большом количестве посещений.
декодируем содержимое файла в массив $info
$info=bdecode(file_get_contents($url_torrent));
хеш можно получить сделав sha1 только части, отвечающей за информацию о файлах внутри. хеш получается только в бинарном виде, добавив true вторым параметром
$hash = sha1(bencode($info['info']),true);
scrape в большинстве случаев получается просто путем замены announce в урле для анонсов торрента
$announce_url=$info['announce'];
$scrape_url = str_replace("announce","scrape",$announce_url);
делаем get запрос к трекеру и полученый ответ тут же декодируем в массив
$scrape_data = bdecode(file_get_contents($scrape_url.'?info_hash='.urlencode($hash)));
echo "Полных раздач: ".$scrape_data['files'][$hash]['complete'];
Задача вторая. Список файлов внутри торрента.
Код ниже только для разовых обращений к файлу. При высокой посещаемости и большом количестве торрент файлов эти данные нужно кешировать в БД или memcached. Вам тут решать уже.
foreach($info['info']['files'] as $file) {
echo $file['path'][0]." Размер ".round($file['length']/1024/1024)." Мб
";
}
Еще кое-что интересненькое о торрентах:
Fortune cookie: diaphragm, n: A childproof cap.
Когда уже твоё “торчок” будет доработан, хочется видеть рабочий вариант торрента.
Эх…. забыл ты про “торчка” Владимир. https://bitbucket.org/21h/torchok Последние изменения 26.06.2012 г. Жаль конечно.
да он работает вообще-то. но там не модулем разбор идет и даже где-то ошибка есть. не всегда правильно разбирает. переделать минута времени. торчок задумывался как подсадка для сайта, поэтому авторизацию нужно прикручивать к основному сайту уже руками. ну или сделать собственную, если трекер самодостаточен и всякие блоги и с форумами не нужны.
Какова дальнейшая жизнь торчка? Он кстати веб-интерфейсом для OpenTracker выступает? Без OpenTracker работать не будет?
торчок давно уже не обновлял, как только закрыл сайт где он работал. да, это морда для opentracker. без opentracker или любого другого открытого трекера работать не будет.