2016-01-25 41 views
8

Mam dziwny problem i nie mogę wydawać się znaleźć rozwiązanie lub coś bliżej kwestii mam,PHP limit połączeń gniazda TCP - serwer Windows

Oto sprawa, Mam skrypt scoket uruchom przez php w linii poleceń, akceptuje połączenia i odczytuje dane w formacie json od klientów aplikacji mobilnych i wysyła odpowiednią odpowiedź w json.

Wszystko działa poprawnie, z wyjątkiem tego, że liczba połączeń nie przekracza 256 połączeń.

Chciałbym wiedzieć, dlaczego tak jest i jak mogę go rozwiązać? Byłem tak przez wiele dni, ale bez powodzenia!

Oto skrypt snippet

<?php 

date_default_timezone_set("UTC"); 
$server = stream_socket_server("tcp://192.168.1.77:25003", $errno, $errorMessage); 

if (!$server) { 
    die("$errstr ($errno)"); 
} 

echo "Server started.."; 
echo "\r\n"; 

$client_socks = array(); 

while (true) { 
    //prepare readable sockets 
    $read_socks = $client_socks; 
    $read_socks[] = $server; 

    //start reading and use a large timeout 
    if (!stream_select ($read_socks, $write, $except, 10000)) { 
     die('something went wrong while selecting'); 
    } 

    //new client 
    if (in_array($server, $read_socks)) { 
     $new_client = stream_socket_accept($server); 

     if ($new_client) { 
      //print remote client information, ip and port number 
      echo 'Connection accepted from ' . stream_socket_get_name($new_client, true); 
      echo "\r\n"; 

      $client_socks[] = $new_client; 
      echo "Now there are total ". count($client_socks) . " clients"; 
      echo "\r\n"; 
     }   

     // echo stream_socket_get_name($new_client, true); 
     //delete the server socket from the read sockets 
     unset($read_socks[array_search($server, $read_socks)]); 
    } 

    $data = ''; 
    $res = ''; 

    //message from existing client 
    foreach($read_socks as $sock) { 
     stream_set_timeout($sock, 1000); 
     while($resp = fread($sock, 25000)) { 
      $data .= $resp; 
      if (strpos($data, "\n") !== false) { 
       break; 
      } 
     } 

     $info = stream_get_meta_data($sock);  

     if ($info['timed_out']) { 
      unset($client_socks[array_search($sock, $client_socks)]); 
      @fclose($sock); 
      echo 'Connection timed out!'; 
      continue; 
     }  

     $client = stream_socket_get_name($sock, true); 

     if (!$data) { 
      unset($client_socks[array_search($sock, $client_socks)]); 
      @fclose($sock);   

      echo "$client got disconnected"; 
      echo "\r\n"; 
      continue; 
     } 

     //send the message back to client 
     $decode = json_decode($data); 


     $encode = json_encode($res); 
     fwrite($sock,$encode."\n");  
    } 
} 

P.S .: Co zrobiłem znaczy, obszerna wyszukiwarka na ten temat, i podeszła artykuł jak te, http://smallvoid.com/article/winnt-tcpip-max-limit.html i dwie dziesiątki innych.

Mam windows 7 działa to coś + WAMP 2.5 kursujący PHP 05.05.12

+0

Oto zrzut ekranu wiersza polecenia, http://prntscr.com/9ul9yh –

+0

Wstyd, że nie kliknąłeś linku na dole artykułu, o którym wspomniałeś - http://smallvoid.com/article/winnt- network-connection-limit.html – symcbean

+0

kolego, rzeczywiście zrobiłem i zmęczyłem się dodając wspomniane słowa D. ale bezużyteczne! Używam Windows 8 jako serwera, czy możesz pomóc? –

Odpowiedz

0

To nie ma nic wspólnego z kodem, to „cecha” z MS Windows, aby można kupić wydanie serwera (lub uaktualnić do innego systemu operacyjnego). Funkcjonalnie nie ma różnicy między serwerem a edycjami jądra NT (niektóre różne usprawnienia optymalizacyjne), to tylko sposób na zapewnienie zgodności z warunkami licencji.

+0

Tak naprawdę to samo wypróbowałem na serwerze Windows z Azure, to samo! jakiego rodzaju serwera powinienem szukać jakiejkolwiek specyfikacji lub czegoś? –

+1

@DragonWarrior Uzyskaj linux;) Windows jest bezużyteczny dla serwera, jeśli nie zamierzasz uruchomić IIS. – RandomSeed