Автоматическое создание Torrent’ов для раздачи файлов на вебсервере Apache + MySQL + PHP
Столкнулся с тем, что на одном из моих сайтов трафик по файлам серьезно вырос с ростом посещаемости ресурса. Файлов достаточно много, средний размер около 80 мб. После отключения файлового сервера за нагрузку и вынужденный переезд стал думать в сторону торрентов, что бы снизить прямую нагрузку на файловый сервер и даже иметь возможность какое-то время обходится без него в случае поломок и.т.д.
Одновременно с этим не хотелось зависеть от сторонних трекеров, которые иногда закрывают и при этом раздачу хотелось максимально автоматизировать. Для этих целей занялся поиском готовых исходников. Особенно долго искать не пришлось. Раздача состоит из трех компонент:
1) Трекер. Для моих целей не нужна регистрация пользователей и не нужен рейтинг, поэтому была взята простейшая его реализация, что бы можно было встроить в свой код. Вуаля трекер всего несколько килобайт веса с минимальным количеством кода, с которым легко разобраться и всего с одной таблицей в БД: OpenTracker. Правда пришлось его слегка переделать и сменить mysql_pconnect на mysql_connect. Что бы коннекты долго не оставались висячими и не достигался лимит подключений БД. Рекомендую ставить трекер на отдельную БД, в случае если нагрузка будет большой. Если вы установили OpenTracker В папку torrent на сервере, то ваш Announce URL для создания торрентов будет: http://yoursite.ru/torrent/announce.php
2) Когда у вас есть трекер хорошо бы автоматизировать создание торрент файлов. Мне удалось встроить это в админку с использованием свободного класса «Torrent RW». Использование класса не просто, а очень просто. Например, для создания торрента для заданного файла требуется 4 строчки:
$torrent = new Torrent( ‘./path-to-file-or-folder’, ‘ http://yoursite.ru/torrent/announce.php’ );
if ( ! $error = $torrent->error() ) // error method return the last error message
$torrent->save(‘test.torrent’); // save to disk
else
echo ‘DEBUG: ‘,$error;
3) Третий компонент это сидер который раздает первую копию файла. Третьим компонентом можете быть вы сами с домашнего компьютера. Если же хочется что бы и раздачу делал сервер, то для этого можно использовать PHP программу TorrentFlux. Ставится в несколько кликов на Web-сервер и управляется через браузер. Добавляете через веб-интерфейс торрент указываете файл и сервер сам раздает файлик. К сожалению мне не удалось сходу автоматизировать раздачу после создания торрента. Приходится делать это руками. Если вдруг кому удастся дайте знать. =)
Для автоматизации можно в создаваемый торрент добавить веб сидов. Только для этого необходимо вернуть ваш файловый сервер. И тогда надобность в TorrentFlux отпадет и торент может сразу раздоваться после создания.
@Дмитрий
Не знал про WebСидов, надо покопаться в классе создания торрента, если там есть поддержка то пожалуй так и сделаю.
Если я правильно понял WebSeed это обычная HTTP ссылка?
Да правильно.Там есть поддержка WebСидов я игрался с этим классом.
$torrent = new Torrent( ‘./path-to-file-or-folder’, ‘ http://yoursite.ru/torrent/announce.php’ );
$torrent->url_list(array(‘HTTP ссылка’));
if ( ! $error = $torrent->error() ) // error method return the last error message
$torrent->save(‘test.torrent’); // save to disk
else
echo ‘DEBUG: ‘,$error;
Вроде так если память не подводит. В массив можете вставлять сколько угодно ссылок.
@Дмитрий
Похоже это то что нужно, в код уже добавил. Осталось только проверить как это все работает на новом торренте без сидов. Вечером займусь.
Спасибо за подсказку. =)
Как вариант с веб сидами, работает?
У меня рабочий торрент получается только с одним файлом, т.е так качает:
$array[1] = ‘Z:\home\yoursite.ru\www\images\second.jpg’;
//Create a new torrent
$torrent = new Torrent( $array );
$torrent->url_list(array(‘хттп://yoursite.ru/images/first.jpg’,’хттп://site.ru/images/second.jpg’));
***
А вот так торрент создаётся, но загрузка файлов, если их несколько, уже не идет:
$array[0] = ‘Z:\home\yoursite.ru\www\images\first.jpg’;
$array[1] = ‘Z:\home\yoursite.ru\www\images\second.jpg’;
//Create a new torrent
$torrent = new Torrent( $array );
$torrent->url_list(array(‘хттп://site.ru/images/first.jpg’,’хттп://site.ru/images/second.jpg’));
Может помните такой момент?
@Anton
Я к сожалению создаю торренты только для одиночных файлов (Вебсиды в этом случае нормально работают), так что подсказать не смогу. =(
Большое спасибо за пост. Вы даже не представляете сколько сайтов я облазил пытаясь обнаружить какой нибудь простейший скрипт трекера.
Кстати, я так понимаю пункты 2 и 3 не обязательны?? Разве что придется торрент создавать и раздавать вручную.
Не могли бы вы поподробнее первый пункт описать?? Думаю не одному мне будет интересно (в инете встречал немало вопросов о том как интегрировать торрент-трекер в сайт на wp, а информации что на английском, что на великом и могучем нет).
Сделал все как здесь описано (+ почитал ридми):
1. Поменял в announce.php mysql_pconnect на mysql_connect
2. Сделал отдельную базу и создал в ней таблицу peers
3. Вписал данные о базе в config.inc.php
4. Закинул все файлы на сервер, создав в корневой директории папку tracker
5. Вручную (в uTorrent) создал торрент-файл, вписав в «трекеры» адрес http://сайт.ru/tracker/announce.php
6. Выложил файл на сайте, скачал его и прохешировал.
В итоге когда на другом компе закидываю файл в клиент отображаются 1 сид, 1 пир, трекер пишет что работает а закачка нифиха не идет.
И что я сделал неправильно?? :((
@LEGION
Вполне вреоятно что на самом деле все работает. Для начала посмотри появились ли в базе данных в таблице peers записи если, да, то хорошо. Убедись что оба компа не находятся за Прокси иначе они друг друга напрямую не увидят, для теста нужен комп с реальным IP.
Записи появились, попросил знакомого поставить скачиваться файл через торрент (он вообще из другого города, так что ИП однозначно не совпадают), в итоге в меню «Трекеры» (для раздачи использую uTorrent) появилось по одному сиду и пиру, статус сервера «Работает». Он у меня скачал 4 Мб (как я понимаю одну часть) и все, загрузка застопорилась…
Я правда не уверен насчет прокси, вроде как слышал что в его локальной сети компы в Интернет выходят используя провайдера как прокси. Может быть в этом проблема?
@LEGION
Ну раз что-то скачалось значит работает. А вообще для теста поболее людей бы …
СпасибА, буду пробовать…
Блин, такое ощущение что в РуНете 5 человек этим вопросом интересуется. Инфы 0 :(
TorrentFlux насколько знаю на обычных хостингах не заводиться, нужен выделенный сервак, да?
@Terkin
Это обычный PHP-движок. Если не ошибаюсь устанавливается через WEB. Доступ к SSH не требуется.
для полного счастья можно использовать нюТоррент для linux
народ подскажите установил се на сайт OpenTracker все поправил создал файл в торренте в писал анонсер вот так http://10.46.63.58/torrent/announce.php
и встал на раздачу но он мне почмуто не показывает пиры так как я же стою на раздаче значит я пир в чем проблемма подскажите ?
@45king
Тебе нужен ещё один человек для теста кто будет качать файл.
начел тестить пир и сидов не показывает я залез в логи смотри там такая ошибка повторяеться [2012-01-01 12:09:53] Banned 176.8.86.89:24587
[2012-01-01 12:10:00] *** Иван Царевич и Серый Волк.avi: PIECE 28 FAILED HASH CHECK
что эти ошибки означают ?
@45king
Не знаю, ни разу не сталкивался. Но вообще такая ошибка означает что HASH не сходится у кусочков. И пир банится как вредоносный…
Turbo
а с таким сталкивал сделал раздачу вписал анонсер встал на раздачу дал другу он ставит на скачку а файл не качает стоет мне нажать напаузу а потом запустить то качает мне кажеться дело в интервале ?
Привет всем. Так же пытаюсь поставить себе трекер, возник вопрос —
Правда пришлось его слегка переделать и сменить mysql_pconnect на mysql_connect. Что бы коннекты долго не оставались висячими и не достигался лимит подключений БД.
Что именно сделано ? Можно ткнуть носом в код ?
@Артем
Уже точно не помню, но вроде бы тупо поменял названия функций.
а по
$torrent = new Torrent( ‘./path-to-file-or-folder’, ‘ http://yoursite.ru/torrent/announce.php’ );
if ( ! $error = $torrent->error() ) // error method return the last error message
$torrent->save(‘test.torrent’); // save to disk
else
echo ‘DEBUG: ‘,$error;
поясни
./path-to-file-or-folder — эт че ? полный путь к файлу с которого торрент буит создаваться ?
@Артем
Да, это путь до файла.
Хм, если пишу — /file/android/game/shoottheapple.apk получаю — DEBUG: Invalid string length, colon not found
Если с полным адресом, включая http:// косяки лезут — пошел ковыряться :)
Все ок ,а вот с раздачей — запарка. TorrentFlux я так понимаю ставится как компонент вэб-сервера, а к серверу доступа нету :(
@Артем
Путь должен быть серверный без HTTP
@Артем
Используй вебсид.
Такс, все работает (у меня), все скачивается, веб сиды, и прочая ерунда :) Возникает проблема, хотя проблемой это и не назовешь по большому счету — скачанный торрент отказывается напрочь раздаваться. то есть в клиенте он подсвечивается красным. Я так понимаю — типа проблема с раздачей файла …
@Turbo
а можно ли вообще сделать с путем на файлопомойку? свою само собой.
но файл лежит на другом сервер?
@Anton
А вот так торрент создаётся, но загрузка файлов, если их несколько, уже не идет:
$array[0] = ‘Z:\home\yoursite.ru\www\images\first.jpg’;
$array[1] = ‘Z:\home\yoursite.ru\www\images\second.jpg’;
//Create a new torrent
$torrent = new Torrent( $array );
$torrent->url_list(array(‘хттп://site.ru/images/first.jpg’,’хттп://site.ru/images/second.jpg’));
****
У меня работает так:
$torrent->url_list(array(‘хттп://site.ru/images/’));
Доброго времени суток!!! Подскажите, с чего начать копать — перенес сайт на другой сервер — ничерта не работает :( , то есть — toorrent-файл не создается, хотя по ранее созданным torrent-файлам можно скачать информацию нормально …
Прошу прощения — разобрался …