Mr.KTO blog


  • Рубрики

  • Поиск

  •  
      
  • Поиск
  • реклама на mrkto.com





Многопоточность в php

Наконец-то реализовал мультипоточность при работе с сокетами.

Выигрыш примерно в 2 раза с быстрыми серверами, соответственно, если сервер медленный, или контент генерируется на лету (напр. flush()), то грузится будет ещё быстрее.

Последний тест:
Дано: нужно загрузить 500 страниц. Проблема в том, что каждая генерируется на чужом сервере и время загрузки каждой примерно 20 сек. Т.е., если загружать все в цикле, то уйдёт около 3-х часов.

Используя многопоточность при 20 одновременных потоках все странички загрузились за 25 минут (<3сек./страница).
При 40 потоках - за 20 минут. В общем прогресс налицо.

Совместимо с php4, позволяет добавлять задачи на лету, используя callback-функцию (onload)

Пример кода, использующего мой класс multi_qrl:

$multi = new multi_qrl;
$multi->max_threads = 20;
$multi->onload = "req_load";
function req_load(&$multi, &$req, $result)
{
    echo $req->URL." ".(($result!==false)?"ok":"fail")."\r\n"; flush();
}   

$multi->add_request(new qrl, "http://www.yandex.ru/");
$multi->add_request(new qrl, "http://www.rambler.ru/");
$multi->add_request(new qrl, "http://www.google.ru/");
$multi->add_request(new qrl, "http://www.yahoo.com/");
$multi->add_request(new qrl, "http://www.sellme.ru/");
$multi->add_request(new qrl, "http://www.habr.ru/");
$multi->add_request(new qrl, "http://www.moneynews.ru/");   

$multi->run();

Класс распостраняется только с моими разработками. Стоимость проектов от $50.

_________________

Для тех, кто не подписался по RSS:

Когда переходить на ООП? I. Зачем использовать классы вместо функций.

Синонимайзер на PHP – достаточно одной строчки

habrahabr.ru google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru rumarkz.ru memori.ru moemesto.ru moikrug.ru myscoop.ru mister-wong.ru rucity.com vaau.ru

Комментарии (7) на “Многопоточность в php”

  1. lol пишет:

    Ну и нахуй это кому нужно без класса?
    Хитровыебаный ты слишком

  2. mrkto пишет:

    Чтобы знали что я могу.

    Епта, лол, а в инете не поискать. Вот хотя бы.

  3. VolCh пишет:

    На чем сделано, сокеты? В консоли работать будет или только под апачем? (столько уже реализаций видел, одна даже с AJAX'ом в браузере, как диспетчером "многозадочности" )

  4. mrkto пишет:

    Я же написал, что сокеты. Может когда-нить сделаю на curl_multi, чтобы узнать что быстрее.

    А почему php не может работать в косоли: php -q file.php

    Про AJAX видел. Долго смеялся :)

  5. VolCh пишет:

    В смысле неблокирующие имелось ввиду и через socket_select()?
    А то есть разновидность того же аякса только без джавы (на первом месте в гугле по запросу твоему, например)

  6. mrkto пишет:

    Да, неблокирующие (stream_select или socket_select). Для неблокирующего открытия сокета надо будет юзать stream_socket_client или socket_set_nonblock.

    Что за аякс без джавы я не понял. На основе браузера - это или AJAX-запросы, или <iframe-ы, можно даже <img src=thread.php. Думаю понятно, что это бред.

    Нормальный вариант - это запуск нескольких процессов php через cron, или exec().

  7. IRL пишет:

    >Нормальный вариант - это запуск нескольких процессов php через cron, или exec().
    Не-не-не, ничего нормального в этом нет! Пример рассмотрен - http://jo-in.ru/articles/post/62 правда через браузер.

Оставить комментарий