Проблема с сокетами. Исключительная

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

На пхп.нет в каментах вычитал:
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

не я один ((
 

WP

^_^
В баг-репортах надо приводить полный код для тестирования, чтоб его можно было сразу запустить. Глянь на дату репорта, думаю имеет смысл отправить новый с полным кодом.
 

tony2001

TeaM PHPClub
Имеет также смысл использовать версию PHP не трёхлетней давности, а более новую.
 

CMD

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