jeka!
Просто Member
Работа с сокетами, как быть с тайм-аутом?
В обшем умучился с этими сокетами в ПХП!
Сначала юзал fsockopen(), в результате заметил что
если удалённый сервер не отвечает, то сокет ожидает
ответ в любом случае, и этот процесс может длиться
офигенно долгое время, у меня 4 часа висел...
Далее полазил тут по топикам, нашел несколько тем
по этому поводу, пишут используй socket_set_timeout();
И тут хренушки!
Это баг очевидный, таймауты не устанавливаются, пробовал на 3
операционках. Под индой один раз заметил, что таймаут поставился,
но всего 1 раз
Далее начал юзать такой вариант:
Тут тоже самое, механизм походу один, и глючный.
Тут же вобще нет возможности установить тайм аут.
По крайней мере в мане я этого не нашел.
Какие могут быть выходы?
Сейчас начал переписывать всё на перл, там похожий
механизм, думаю что возможно результат будет тот же.\
На край можно ещё на С попробывать...
В общем кто сталкивался с этим и как решил проблему, напишите...
В обшем умучился с этими сокетами в ПХП!
Сначала юзал fsockopen(), в результате заметил что
если удалённый сервер не отвечает, то сокет ожидает
ответ в любом случае, и этот процесс может длиться
офигенно долгое время, у меня 4 часа висел...
Далее полазил тут по топикам, нашел несколько тем
по этому поводу, пишут используй socket_set_timeout();
И тут хренушки!
Это баг очевидный, таймауты не устанавливаются, пробовал на 3
операционках. Под индой один раз заметил, что таймаут поставился,
но всего 1 раз
Далее начал юзать такой вариант:
PHP:
$port = getservbyname('www','tcp');
$sk = socket_create(AF_INET, SOCK_STREAM, getprotobyname("TCP"));
if ($sk < 0) echo socket_strerror($sk);
$result = socket_connect($sk, gethostbyname($host), $port);
if ($result < 0) echo socket_strerror($sk);
$put = "HEAD ".$path." HTTP/1.0\r\n";
$put .= "Host: ".$host."\r\n\r\n";
$head = '';
socket_write($sk, $put, strlen($put));
while ($out = socket_read($sk, 1024)) $head .= $out;
if (!preg_match("!HTTP/(\d{1}\.\d{1})\s+(\d{3})\s+!s", $head, $get))
echo "hren, a ne connect!";
socket_close($sk);
Тут же вобще нет возможности установить тайм аут.
По крайней мере в мане я этого не нашел.
Какие могут быть выходы?
Сейчас начал переписывать всё на перл, там похожий
механизм, думаю что возможно результат будет тот же.\
На край можно ещё на С попробывать...
В общем кто сталкивался с этим и как решил проблему, напишите...