Неблокирующие(асинхронные) сокеты глючат в PHP5?

sfes

Новичок
Неблокирующие(асинхронные) сокеты глючат в PHP5?

Помогите разобраться с такой вот проблемой:
необходимо реализовать быстрый[\B] перебор хостов с посылкой запроса каждому.
Я нашел статью http://netevil.org/node.php?nid=280.
Т.е. нужно использовать многопоточность и притом асинхронно, чтобы сокеты не блокировались.

Я навернул немного скрипт из статьи и тестирую его на 20 хостах и 1, 3, 5, 10 сокетах.
Как только какойто сокет освобождается (fread возвращает 0), я переоткрываю его на следующий хост, и так, пока не прохожу все 20 хостов.

Так вот, при одном сокете в крайнем случае один-два запрос не срабатывают.
Если же брать больше сокетов, то выход по таймауту (т.е. когда fread возвращает 0) намного возрастает.
К примеру при 10 сокетах 14-16 хостов оказываются недоступны.

Такое ощущение что это происходит из-за глюков в самой реализации потоков.

Помогите, плз, с этим разобраться.
Могу выложить свой скрипт.
 

Screjet

Новичок
притом асинхронно, чтобы сокеты не блокировались
хех, асинхронно обозначает блокирование с ожиданием события ( socket_select(), stream_select() )

Но реально примеры все однопоточные, а замораживается скрипт у тебя скороее всего на получении адреса от ДНС.

Для начала изучения многопоточности почитай про pcntl_fork()
 

white phoenix

Новичок
я когда делал подобный скрипт, я сделал 100 тестовых коннектов на каждый из хостов в то время когда он доступен, и посчитал время отклика (тест надо запускать непосредственно на той машине на который в последствие будет запущен проверяющий скрипт), посчитал среднее время отклика и проставил таймауты, сделал N/1.5 потоков, где N - число хостов. таким образом всё проверялось нормально.
 

sfes

Новичок
Screjet
Для начала изучения многопоточности почитай про pcntl_fork()
такое не прокатывает - это работа со многими процессами - могут повесить машину, если их много.

Screjet
Но реально примеры все однопоточные, а замораживается скрипт у тебя скороее всего на получении адреса от ДНС
пробовал и через ip-шники, без ДНС имен - то же...

white phoenix
я когда делал подобный скрипт, я сделал 100 тестовых коннектов на каждый из хостов в то время когда он доступен, и посчитал время отклика (тест надо запускать непосредственно на той машине на который в последствие будет запущен проверяющий скрипт), посчитал среднее время отклика и проставил таймауты, сделал N/1.5 потоков, где N - число хостов. таким образом всё проверялось нормально.
пример не покжешь?
 
Сверху