Как стать автором
Обновить

Комментарии 40

Поиск работает шустро и все действительно просто я понятно. Не могу сказать, что «зеркало раздач» это до конца верное название, ведь это просто поиск. Если трекер перестанет работать то и многие раздачи просто растеряют сидов через какое-то время.

Эх, проходят года, а на PHP можно написать все так-же, как когда-то.
mysql_connect("localhost", "torrent", "password") or die("Could not connect to MySQL");


Время остановилось. Шел 2015 год. В репозиториях лежал PHP7. А на самом посещаемом IT ресурсе рунета продолжали писать mysql_connect и делать из кода лапшу.
просто статья лежала на модерации лет 5
Вы хотели сказать 15?
Я запускаю много сайтов на различных серверах и нигде не встречал PHP7. Конечно, может быть мои сервера старые.
mysql_connect в статусе deprecated начиная с версии PHP 5.5, если мне память не изменяет. Актуальная версия пятой ветки PHP 5.6. Не заметить предупреждения можно только если везде ставить error_reporting(0), что при разработке/тестах очень странно. Или вы из принципа используете устаревшие функции в надежде на то, что ни один из ваших серверов никогда не обновится до актуальной версии?
# apt-cache search php5 | wc -l
100
# apt-cache search php6 | wc -l
0
# apt-cache search php7 | wc -l
0

Debian Stable.
Это комментарий к «В репозиториях лежал PHP7».

наверно и на дебиане заведется

Может быть, зачем только? Чтобы весь старый софт переписывать?
Для дебиана есть отличный репозиторий обновлений связанных с web пакетов — http://dotdeb.org/
Автор, а Вы в курсе, что расширение mysql и функции mysql_* deprecated c версии 5.5 и будут удалены в 7?
Ну, можно еще добавить, что Sphinx давно не требует специальных библиотек, а позволяет запрашивать данные по MySQL интерфейсу. Да, некоторый функционал через него пару лет назад не работал (сложная агрегация), но то, что у автора в коде, работало уже тогда.

Но вообще, больше всего меня порадовал вот этот момент

Открываем браузер, открываем url «http://site.ru/db/insert_to_db.php?f=category_10.csv». Проделываем тоже самое с каждым файлом CSV. Да, все это можно было автоматизировать, но я специально написал так, что бы было максимально всё понятно.

36 файлов. Таймаут в скрипте установлен на 3 минуты/файл. Итого, больше 1.5 часов перед монитором, вручную перебирая цифры. У меня ощущение, что автор не дошел до главы, где объясняют, как в PHP можно получить список файлов в директории, поэтому списал этот момент на «усложнение кода».
В некоторых случаях оптимальней идти напролом, нежели придумывать элегантные решения. Я к таким случаям отношу однократную установку или настройку. Безусловно автор мог создать академический вылизанный код, однократно выполняемый при установке, но посчитал это лишней тратой времени.
Причём здесь «академичность»? Мне кажется, тут есть смысл говорить не об академичности, а о банальном знакомстве автора с возможностями выбранных инструментов. Или вы считаете, что тратить 1.5 часа собственного времени на заполнение базы в полуавтоматическом режиме это нормально? При том, что можно это автоматизировать буквально тремя строчками кода. Не двумястами, не пятьюстами, а тремя. Единственный вариант, когда такое может быть оправдано, это если 1.5 часа твоего времени стоят меньше, чем набор трёх строк кода.
О том, что можно запустить несколько параллельных потоков
http://site.ru/db/insert_to_db.php?f=category_*.csv
в разных окнах/табах, не подумал?
А зачем эти сложности? За 10 минут можно такой скрипт накатать:

<?php
function println($message) {
    echo $message, PHP_EOL;
}

mb_internal_encoding('UTF-8');

$db = new PDO('mysql:host=localhost;port=3306;dbname=torrent;charset=utf8', 'torrent', 'password', [
    PDO::ATTR_PERSISTENT => 1,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => 0,
]);

foreach (glob('csv_data/*.csv') as $file) {
    $fp = fopen($file, 'r');

    if (!is_resource($fp)) {
        println("Can't open $file");
        continue;
    }

    $counter = 0;

    while (($data = fgetcsv($fp, 0, ';')) !== false) {
        if (count($data) == 0 && is_null($data[0])) {
            continue;
        }

        $db->prepare('INSERT INTO `torrents` (`name`,`hash`,`date`,`size`,`topic_id`,`cat_id`,`cat_name`) VALUES (?,?,?,?,?,?,?)')->execute([$data[4], $data[3], $data[6], $data[5], $data[2], $data[0], $data[1]]);

        $counter++;
    }

    println("Processed $counter entries from $file");

    fclose($fp);
}

println('Done');


Его можно дополнительно адаптировать к запуску из web (добавив set_time_limit и заменив PHP_EOL на <br>) — секунд за 20 это можно сделать. А так, он уже готов из консоли работать.
count($data) == 0

Я имел ввиду: count($data) == 1 — опечатался. Когда fgetcsv встречает пустую строку, он делает массив: [null].
Опять же, в MySQL можно напрямую загружать CSV-файлы — вообще тогда никаких скриптов не нужно писать.
К сожалению не понимаю математики про 1.5 часа, таймаут не равен времени исполнения, плюс можно запустить несколько параллельных потоков.
А в реальной жизни бывает так что три строчки кода стоят дороже полного рабочего дня.
Автоматизировать и обвешивать плюшками можно до бесконечности.
В этом случае статья заняла бы много экранов, а читатели начали бы зевать уже на файле insert_to_db.php.
Гораздо важнее изложить базовые принципы, пожертовав лишними и отвлекающими внимание плюшками — с чем автор вполне нормально справился (держи пять!).
Кому не хватает автоматического обхода листинга директории — тот сам себе напишет; и ни к чему это тащить сюда, где выжимки самого главного.

з.ы. set_time_limit() лишь ограничивает время исполнения, а не устанавливает его в. Так что, скрипт может выполниться и за 10 секунд, если файл небольшой.
можно сообразить про
curl http://site.ru/db/insert_to_db.php?f=category_{1..36}.csv
Я же написал «все это можно было автоматизировать, но я специально написал так, что бы было максимально всё понятно». Или Вы решили проигнорировать это предложение?
с версии 5.5 расширение mysql считается устаревшим, а в 7 версии его уже не будет. С учетом того, что 7 версия уже вышла, стоит забыть этот пережиток прошлого
А как сделать чтобы обновлялось каждый час с RuTracker? Раз в месяц обновления — это очень редко.
Подождите пока автор дойдёт до соответствующей главы и выложит наполненный болью и безысходностью код парсера rutracker на регулярных выражениях. Ведь про DOM в его книжке еще не знают. Да и вообще DOM усложняет код — регулярки привычнее.
НЛО прилетело и опубликовало эту надпись здесь
Зачем велосипеды, если в mysql можно напрямую загрузить csv?
Зачем велосипеды, если в sphinx можно напрямую загрузить csv?
Просьба. Автор, залейте код на гитхаб и дайте людям оформить баги/предложения/пуллреквесты.
VCS усложняют разработку. ZIP — выбор настоящих программистов! Просите архив, потом выложите ссылку на архив со своими правками, там, глядишь, еще кто подтянется.
Один мой знакомый примерно так и принимал пул-реквесты к своей CMS =) Он почему то считал что освоить VCS сложнее чем вручную мержить изменения из кучи файликов =)
Модератор зачем-то удалил ссылку на сайт-пример, не понятно для чего это было сделано. Нарушений правил нету. Попробую оставить её снова. Ведь на рабочем примере будет более понятно, как все работает: rutracker.online
А нельзя изменить магнет-ссылку ссылкой на torrent файл?

Что бы можно было её добавить сразу торрент-клиент на роутере?
Последнее обновление было в январе 2016…
Вот из-за такого кода и насмеиваються над PHP
Подключение в БД копипастом в 3-х разных файлах…
В трех Карл!!!

Зачем использовать mysql_connect, когда все давно используют PDO, он и не диприкейтед и безопасней в использовании?!

Ну а про выборку из базы прямо среди HTML кода, я пожалуй просто промолчу.
Главная страница на чистом HTML, без использования PHP

Тогда зачем файлу расширение php?

Глянул пример реализации. По запросу «terminator» 951 результат, по «terminator 1991» — 18642. Гениально.

Столько критики, а за восемь лет никто правильную статью не написал, между тем последний дамп Рутрекера 11 дней назад выложен. Зато все знают, как надо.

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории