неблокирующие сокетами (как их контролировать?)

BoBka-altRUist

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

запускается у меня несколько процессов использую настройку pcntl
запускаются они функцией pcntl_exec тут все нормально.

каждый из этих процессов открывает заданное количество сокетов примерно так:

PHP:
01 $done = false;
02 while (!$done) {
03 
04     if ($max_sockets > count($sockets)) {
05         $socket = fsockopen($host, $port, $errno, $error, 30);
06         if (!$socket) {
07             //blablabla
08         } else {
09             stream_set_blocking($socket, 0);
10             stream_set_timeout($socket, 3600);
11             fputs($socket, $query);
12 
13             $uid = md5(time());
14             $sockets[$uid] = $socket;
15         }
16     }
17 
18     reset($sockets);
19 
20     while ($socket = current($sockets)) {
21         if (feof($socket)) {
22             fclose($socket);
23             unset($sockets[key($sockets)]);
24         } else {
25             $temp = fgets($socket, 1000);
26         	next($sockets);
27     	}
28     }
29     //sleep(1);
30 
31     if (count($sockets) == 0)
32         $done = true;
33 }
все работает нормально, но время от времени бывают такие ситуации когда сокет открылся, потом (я так думаю)
"что-то случилось", например хост превысил лимит ожидания, размер страницы большой или еще что-то из-за чего сокет так и остается открытым. (процесс курсирует от 25-й и до 31-й строчки бесконечно)

как получить информацию о том что на нем происходит и на каком этапе это лучше делать?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
что это mrmax не заблокировал это обсуждение со словами curl и socket ?
праздник, не иначе :)
 

b0bah1

Новичок
Ты задал параметр тайм-аута здесь - "stream_set_timeout($socket, 3600);"
Тебе нужно обработать этот параметр получив данные о сокете в массиве, если [time_out] будет true - значит что то произошло.
А так у тебя в цикле считывания не происходит удаления сокетов по тайм-ауту. Вот и происходит бесконечная работа.
 

b0bah1

Новичок
это булевское значение, либо true либо false
Если true - значит сработал выход по тайм-ауту и можно удалять сокет.

-~{}~ 23.04.09 19:25:

Да кстати stream_set_timeout($socket, 3600); очень большой тайм аут, поставь максимум минуту - 2.
У а тебя целый час ждет.
 

cDLEON

Онанист РНРСlub
а curl в данном случае лишнее.
нука-нука в чём это лишнее? В том, что не нужно пытаться писать на ПХП обработчик для pcntl ? :)
То, что вы могли уместить в пару строк и забыть о багах, вы умещаете в кучу строк и возитесь с багами :) Ну-ну :) Понимаю там - сервер специфический, с чем не может работать так как надо готовое, заточенное под веб-сервера.
Навыдумывали себе гемороя - удачи в отледке :)
 

BoBka-altRUist

Новичок
b0bah1 это для примера, конечно я пробовал разные, [time_out] всегда false.
я видел в логах версий php постоянно с таймаутом проблемы, ладно сделал свой таймаут - просто подсчет времени, если заголовки в течении нескольких секунд не получены то ссылка битая.

а курл надо доставлять в этом его минус.
посмотрю как-нибудь
 

weregod

unserializer
на любом нормальном тарифе curl есть
исключение - некие жёсткие требования

php тоже доставлять иногда надо ;)
 
Сверху