LINUX.ORG.RU

[PHP] Распараллеливание соединений

 


0

1

Dear All,

прошу помощи, дайте направление в какую сторону копать.

Есть задача: написать шустрый domain availability checker, то бишь скрипт, который бы выполнял от 15 до 30 запросов к 4-6 whois сервисам, чтобы проверить занят ли домен для определенных ccTLD и gTLD.

Задержки на используемых whois сервисах 0.2 - 4 секунд. Желательно, чтобы скрипт отрабатывал все запросы в этих же пределах, причем если какой-то whois сервис вернул результат раньше других, чтобы этот результат был доступен сразу.

Собственно, как это реализовать? Что использовать для создания асинхронных соединений (какой-нибудь gearman, stream* функции)?


Если я правильно понял, надо получать ответы от всех сервисов параллельно - не последовательно.

Может быть создать несколько socket-соединений, отправить по ним запросы, и слушать когда придут ответы. Ответы тут конечно будут обрабатыватся последовательно.

Как тут: http://www.ibm.com/developerworks/opensource/library/os-php-multitask/

valich ★★★
()

>Собственно, как это реализовать? Что использовать для создания асинхронных соединений (какой-нибудь gearman, stream* функции)?

Я у себя для асинхронной работы использую демона, принимающего запросы с gearman, делающего форк с задачей и возвращаясь в основной ветке к gearman'у за следующим заданием.

Соответственно, в процедуре, требующей несколько тяжеловесных задач, мы не выполняем их, а отсылаем gearman'у. Скажем, при ответе юзера на форум не ждём, пока разошлются все письма с нотификациями, а отправляем задания «разослать нотификации» в очередь и сразу возвращаемся к пользователю.

Правда, примеры с кодом сейчас показать не могу, воюю с восстановлением серверов: http://www.linux.org.ru/forum/talks/6486325 :) Может, к обеду подниму.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Я тоже склонялся к gearman, но я по-правде говоря не знаю, что классифицируется как тяжеловесная задача. Worker будет только запрашивать данные у whois сервиса и без особой обработки пихать в memcached. Собственно, если whois сервис может вернуть данные данные практически моментально (по крайней мере некоторые из них), не будет ли оверхед от использования gearman'a (добавление задач в очередь, распределение по worker'ам и т.д.) увеличивать время выполения скрипта?

С другой, некоторые регистраторы предоставляют SOAP интерфейс для whois запросов. Можно ли как-то использовать stream_select для нативного SoapClient?

BobiKK
() автор топика

gearman, конечно, хорошо, но не думаю, что тут стоит использовать нечто подобное - слишком сложно.

Если хочется отправлять один запрос сразу нескольким whois-серверам, то можно использовать stream*-функции с неблокирующимися сокетами, но там есть подводные камни. При возрастании количества обращений может случится внезапный бан со стороны сервера, особенно если IP не менять.

Если один запрос идет к одному серверу, то проще сделать так: есть «демон», который всегда запущен (запускается по крону раз в 1-5 минут, если не обнаруживает свою копию - запускается, если уже запущен - умирает). Этот «демон» постоянно смотрит в табличку реквестов - как только появился новый реквест, «демон» запускает его обработчик через форк (можно и через exec, если не хочется заморачиватся с pcntl). Обработчик делает запрос и пишет результат в базу.

Получится чуть медленнее, чем в первом варианте, но не думаю, что на много.

P.S. Второй вариант еще можно дополнить доп. проверками незавершенных заданий, умерших обработчиков и т.п., в зависимости от задачи.

it-partizan
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.