Главная > FAQ, Программирование > Автоматическое создание Torrent’ов для раздачи файлов на вебсервере Apache + MySQL + PHP

Автоматическое создание 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-сервер и управляется через браузер. Добавляете через веб-интерфейс торрент указываете файл и сервер сам раздает файлик. К сожалению мне не удалось сходу автоматизировать раздачу после создания торрента. Приходится делать это руками. Если вдруг кому удастся дайте знать. =)

  1. Дмитрий
    31 Май 2010 в 11:02 | #1

    Для автоматизации можно в создаваемый торрент добавить веб сидов. Только для этого необходимо вернуть ваш файловый сервер. И тогда надобность в TorrentFlux отпадет и торент может сразу раздоваться после создания.

  2. Turbo
    31 Май 2010 в 11:06 | #2

    @Дмитрий
    Не знал про WebСидов, надо покопаться в классе создания торрента, если там есть поддержка то пожалуй так и сделаю.

    Если я правильно понял WebSeed это обычная HTTP ссылка?

  3. Дмитрий
    31 Май 2010 в 11:22 | #3

    Да правильно.Там есть поддержка 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;

    Вроде так если память не подводит. В массив можете вставлять сколько угодно ссылок.

  4. Turbo
    31 Май 2010 в 11:32 | #4

    @Дмитрий
    Похоже это то что нужно, в код уже добавил. Осталось только проверить как это все работает на новом торренте без сидов. Вечером займусь.

    Спасибо за подсказку. =)

  5. Anton
    17 Ноябрь 2010 в 20:57 | #5

    Как вариант с веб сидами, работает?
    У меня рабочий торрент получается только с одним файлом, т.е так качает:
    $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’));

    Может помните такой момент?

  6. Turbo
    17 Ноябрь 2010 в 22:20 | #6

    @Anton
    Я к сожалению создаю торренты только для одиночных файлов (Вебсиды в этом случае нормально работают), так что подсказать не смогу. =(

  7. 25 Ноябрь 2010 в 17:23 | #7

    Большое спасибо за пост. Вы даже не представляете сколько сайтов я облазил пытаясь обнаружить какой нибудь простейший скрипт трекера.
    Кстати, я так понимаю пункты 2 и 3 не обязательны?? Разве что придется торрент создавать и раздавать вручную.

  8. 26 Ноябрь 2010 в 02:20 | #8

    Не могли бы вы поподробнее первый пункт описать?? Думаю не одному мне будет интересно (в инете встречал немало вопросов о том как интегрировать торрент-трекер в сайт на 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 пир, трекер пишет что работает а закачка нифиха не идет.
    И что я сделал неправильно?? :((

  9. Turbo
    26 Ноябрь 2010 в 09:54 | #9

    @LEGION
    Вполне вреоятно что на самом деле все работает. Для начала посмотри появились ли в базе данных в таблице peers записи если, да, то хорошо. Убедись что оба компа не находятся за Прокси иначе они друг друга напрямую не увидят, для теста нужен комп с реальным IP.

  10. 27 Ноябрь 2010 в 03:53 | #10

    Записи появились, попросил знакомого поставить скачиваться файл через торрент (он вообще из другого города, так что ИП однозначно не совпадают), в итоге в меню «Трекеры» (для раздачи использую uTorrent) появилось по одному сиду и пиру, статус сервера «Работает». Он у меня скачал 4 Мб (как я понимаю одну часть) и все, загрузка застопорилась…
    Я правда не уверен насчет прокси, вроде как слышал что в его локальной сети компы в Интернет выходят используя провайдера как прокси. Может быть в этом проблема?

  11. Turbo
    29 Ноябрь 2010 в 07:56 | #11

    @LEGION
    Ну раз что-то скачалось значит работает. А вообще для теста поболее людей бы …

  12. 4 Декабрь 2010 в 06:44 | #12

    СпасибА, буду пробовать…
    Блин, такое ощущение что в РуНете 5 человек этим вопросом интересуется. Инфы 0 :(

  13. 15 Декабрь 2010 в 22:01 | #13

    TorrentFlux насколько знаю на обычных хостингах не заводиться, нужен выделенный сервак, да?

  14. Turbo
    19 Декабрь 2010 в 11:41 | #14

    @Terkin
    Это обычный PHP-движок. Если не ошибаюсь устанавливается через WEB. Доступ к SSH не требуется.

  15. 18 Февраль 2011 в 22:26 | #15

    для полного счастья можно использовать нюТоррент для linux

  16. 45king
    31 Декабрь 2011 в 06:45 | #16

    народ подскажите установил се на сайт OpenTracker все поправил создал файл в торренте в писал анонсер вот так http://10.46.63.58/torrent/announce.php
    и встал на раздачу но он мне почмуто не показывает пиры так как я же стою на раздаче значит я пир в чем проблемма подскажите ?

  17. Turbo
    31 Декабрь 2011 в 11:02 | #17

    @45king
    Тебе нужен ещё один человек для теста кто будет качать файл.

  18. 45king
    1 Январь 2012 в 06:01 | #18

    начел тестить пир и сидов не показывает я залез в логи смотри там такая ошибка повторяеться [2012-01-01 12:09:53] Banned 176.8.86.89:24587
    [2012-01-01 12:10:00] *** Иван Царевич и Серый Волк.avi: PIECE 28 FAILED HASH CHECK

    что эти ошибки означают ?

  19. Turbo
    1 Январь 2012 в 12:51 | #19

    @45king
    Не знаю, ни разу не сталкивался. Но вообще такая ошибка означает что HASH не сходится у кусочков. И пир банится как вредоносный…

  20. 45king
    2 Январь 2012 в 19:26 | #20

    Turbo
    а с таким сталкивал сделал раздачу вписал анонсер встал на раздачу дал другу он ставит на скачку а файл не качает стоет мне нажать напаузу а потом запустить то качает мне кажеться дело в интервале ?

  21. 17 Январь 2012 в 10:49 | #21

    Привет всем. Так же пытаюсь поставить себе трекер, возник вопрос —

    Правда пришлось его слегка переделать и сменить mysql_pconnect на mysql_connect. Что бы коннекты долго не оставались висячими и не достигался лимит подключений БД.

    Что именно сделано ? Можно ткнуть носом в код ?

  22. Turbo
    17 Январь 2012 в 11:18 | #22

    @Артем
    Уже точно не помню, но вроде бы тупо поменял названия функций.

  23. 17 Январь 2012 в 12:28 | #23

    а по

    $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 — эт че ? полный путь к файлу с которого торрент буит создаваться ?

  24. Turbo
    17 Январь 2012 в 13:46 | #24

    @Артем
    Да, это путь до файла.

  25. 17 Январь 2012 в 15:33 | #25

    Хм, если пишу — /file/android/game/shoottheapple.apk получаю — DEBUG: Invalid string length, colon not found

    Если с полным адресом, включая http:// косяки лезут — пошел ковыряться :)

  26. 17 Январь 2012 в 16:05 | #26

    Все ок ,а вот с раздачей — запарка. TorrentFlux я так понимаю ставится как компонент вэб-сервера, а к серверу доступа нету :(

  27. Turbo
    17 Январь 2012 в 17:00 | #27

    @Артем
    Путь должен быть серверный без HTTP

    @Артем
    Используй вебсид.

  28. 17 Январь 2012 в 21:44 | #28

    Такс, все работает (у меня), все скачивается, веб сиды, и прочая ерунда :) Возникает проблема, хотя проблемой это и не назовешь по большому счету — скачанный торрент отказывается напрочь раздаваться. то есть в клиенте он подсвечивается красным. Я так понимаю — типа проблема с раздачей файла …

  29. 10 Декабрь 2012 в 23:40 | #29

    @Turbo

    а можно ли вообще сделать с путем на файлопомойку? свою само собой.
    но файл лежит на другом сервер?

  30. smake
    7 Май 2013 в 22:08 | #30

    @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/’));

  1. Пока что нет уведомлений.