вопрос по сокетам

Духовность™

Продвинутый новичок
вопрос по сокетам

Простите, никогда раньше практически не работал...

я отправляю get запрос с кучей заголовков, имитирующих броузер и не пойму, а почему ответ так медленно приходит? десятки секунд приходится ждать.
 

Духовность™

Продвинутый новичок
ошибок никаких не возникает.
я тупо скопировал скрипт из мануала и подставил google.ru в качестве тестового хоста. ответ получаю до минуты времени.
 

MiRacLe

просто Чудо
>> причина вероятно в dns

>> там и так $address = gethostbyname($host);

[недопущено к публикации]

ты можешь сам, без нищебродства, найти в каком именно месте "тормоза"? вывести временные метки? добавить flush ?

>> и зачем мне разрывать соединение?

за шкафом
 

Духовность™

Продвинутый новичок
[недопущено к публикации]

вот функция - http://phpclub.ru/paste/index.php?show=2264

хост ya.ru, например, нормально получаю
тормозит при попытке чтения ответа гугля. А ИМЕННО, тормозит блок чтения из сокета:

PHP:
// Время работы скрипта на данном участке [b]0.004[/b]
    $out = '';
    while ($s = socket_read ($socket, 2048)) {
        $out .= $s;
    }
// Время работы скрипта на данном участке [b]58 секунд [/b]
Вот. Чем может быть вызвана данная задержка?
 

MiRacLe

просто Чудо
если таймаут наблюдается только с гуглом, то вероятно это ожидание последнего байта (если начать читать мелкими порциями, сбрасывая буфер, то ожидание будет только перед последней)

-~{}~ 18.02.09 23:37:

HTTP/1.0 тебя должно спасти

-~{}~ 18.02.09 23:41:

про последний байт это конечно было бредом - "1.1" проглядел - keep-alive и ожидание следующего запроса...
 

DiMA

php.spb.ru
Команда форума
while ($s = socket_read ($socket, 2048)) {
$out .= $s;
}

в подобных циклах необходим usleep(20)
 

MiRacLe

просто Чудо
да, раскройте, пожалуйста, тему - кому необходим и почему именно 20 ?
 

DiMA

php.spb.ru
Команда форума
чтобы проц не грузить бесконечной и бесполезной нагрузкой
причем здесь бан. Или это шутка юмора?
хотя... в данном случае сокет блокирующий, usleep не нужен
для неблокирующего - обязательно
20 мс - теоретически примерно самая минимальная пауза, нет разницы между 1 и 25 мс паузой
 

fixxxer

К.О.
Партнер клуба
с неблокирущими вообще надо через socket_select работать. :) если соединений много - то вон там Тони писал pecl/libevent, может и его можно заюзать, хотя не знаю, какими типами ресурсов он оперирует.
 

DiMA

php.spb.ru
Команда форума
блокирующий поток (файл, сокет и т.д.) : fgets($f, 10) завершится, только дождавшись чтения ровно 10 байт или конца потока (и может зависнуть, ожидая 10 байт)
неблокирующий - сразу завершится (возможно, успев прочитать что-нибудь)
 
Сверху