CMD
Новичок
Проблема с сокетами. Исключительная
Нужна была поддержка многопоточности - написал по рецепту комрада http://netevil.org/node.php?nid=280&SC=1 на неблокируемых сокетах. Все прекрасно... но на одном сервере упорно октказывается работать - я уж извелся весь иская причину. Может быть сдесь мне помогут.
Итак не работает это на сервере:
Linux
PHP Logo
PHP Version 4.3.11
Apache 2.0 Handler
сокеты естесно включены. возвращает ошибку при попытке подключения:
Warning: socket_connect() unable to connect [115]: Operation now in progress in
На пхп.нет в каментах вычитал:
Вот собсно не знаю что и думать
ниже код:
спасите - помогите!
-~{}~ 20.05.06 18:19:
http://bugs.php.net/bug.php?id=28136
не я один ((
Нужна была поддержка многопоточности - написал по рецепту комрада http://netevil.org/node.php?nid=280&SC=1 на неблокируемых сокетах. Все прекрасно... но на одном сервере упорно октказывается работать - я уж извелся весь иская причину. Может быть сдесь мне помогут.
Итак не работает это на сервере:
Linux
PHP Logo
PHP Version 4.3.11
Apache 2.0 Handler
сокеты естесно включены. возвращает ошибку при попытке подключения:
Warning: socket_connect() unable to connect [115]: Operation now in progress in
На пхп.нет в каментах вычитал:
Но что-то мне это не помогло.If you're using non-blocking, be sure not to turn it on until after you connect, otherwise you will get the mesasge:
PHP Warning: socket_connect() unable to connect [115]: Operation now in progress in file.php on line 123
and socket_connect() will return false (even though it will connect).
Вот собсно не знаю что и думать
ниже код:
PHP:
<?
if (substr(PHP_OS, 0, 3) == 'WIN') {
define('INPROGRESS', 10035);
} else {
define('INPROGRESS', 115);
}
function multiHTTP ($urls, $ipList = false, $timeout = false) {
$sendedSock = array();
$sockets = array();
$alldata = array();
foreach ($urls as $id=>$url) {
$hostData = parse_url($url);
$domain = $hostData['host'];
$hosts[$id]['host'] = $domain;
$hosts[$id]['query'] = $hostData['path'].'?'.$hostData['query'];
$hosts[$id]['port'] = isset($hosts[$domain]['port']) ? $hosts[$domain]['port'] : 80;
$hosts[$id]['ip'] = isset($ipList[$domain]) ? $ipList[$domain] : gethostbyname($domain);
}
/* подключаем все сокеты */
foreach ($hosts as $id => $host) {
$s = nonBlockingConnect($hosts[$id]['ip'], $hosts[$id]['port'], $errno, $errstr);
if ($s) {
$address = $hosts[$id]['host'];
$alldata[$address] = '';
$sockets[$id] = $s;
}
else {
echo "Socket failed for host {$hosts[$id]['host']}";
}
}
$timeStart = time();
$allSock = count($sockets);
while (count($sockets) > 0) {
/* Если прошло больше времени, чем отпущено на выполнение
всей функции то выходим из цикла пора отдать, то что есть юзверю - хотя бы 1 сокет длжен быть прочитан*/
if ((time() - $timeStart >= $timeout) && ($allSock != count($sockets))) {
echo '<!-- timeout -->';
break;
}
$read = $write = $sockets;
$n = socket_select($read, $write, $e = null, 0);
if ($n > 0) {
/* пишем в доступные для записи сокеты и закрываем их */
foreach ($write as $w) {
$id = array_search($w, $sockets);
if(!isset($sendedSock[$id])) { // Если в этот сокет еще не писали
$header = "GET {$hosts[$id]['query']} HTTP/1.0\r\n";
$header .= "Host: {$hosts[$id]['host']}\r\n";
$header .= "Connection: Close\r\n\r\n";
socket_write($w, $header, strlen($header));
$sendedSock[$id] = 'request has been sent'; // оставляем инфо о том что в этот сокет уже писали
}
}
/* доступные для чтения сокеты содержат данные или инфорамцию о неудачных коннектах */
foreach ($read as $r) {
$id = array_search($r, $sockets);
$address = $hosts[$id]['host'];
$data = socket_read($r, 8192);
if (strlen($data) == 0) {
@socket_close($r);
unset($sockets[$id]);
} else {
$alldata[$address] .= $data;
}
}
}
}
return $alldata;
}
function nonBlockingConnect($ip, $port, &$errno, &$errstr)
{
$s = socket_create(AF_INET, SOCK_STREAM, 0);
if (socket_set_nonblock($s)) {
$r = socket_connect($s, $ip, $port);
if ($r || (socket_last_error() == INPROGRESS)) {
$errno = INPROGRESS;
return $s;
}
}
$errno = socket_last_error($s);
if ($errno == 11004) {
$errstr = 'сервер недоступен';
} else {
$errstr = socket_strerror($errno);
}
#print $errstr;
socket_close($s);
return false;
}
?>
-~{}~ 20.05.06 18:19:
http://bugs.php.net/bug.php?id=28136
не я один ((