2016-01-25 13 views
8

Tôi có một vấn đề kỳ lạ và tôi dường như không thể tìm ra giải pháp hoặc bất cứ điều gì gần gũi hơn với những vấn đề tôi đang gặp khó,PHP kết nối socket TCP Giới hạn - Windows server

Đây là điều, tôi có một kịch bản scoket chạy qua php trên dòng lệnh, nó chấp nhận kết nối và đọc dữ liệu ở định dạng json từ ứng dụng khách di động và gửi phản hồi thích hợp trong json.

Mọi thứ hoạt động tốt ngoại trừ số lượng kết nối không vượt quá 256 kết nối.

Tôi muốn biết tại sao điều đó lại xảy ra và làm thế nào tôi có thể giải quyết nó? Tôi đã được nó trên rất nhiều ngày, nhưng không có may mắn!

Dưới đây là đoạn mã script

<?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 .: Điều gì tôi đã làm là, tìm kiếm mở rộng về chủ đề này, và đã đi qua bài viết như thế này, http://smallvoid.com/article/winnt-tcpip-max-limit.html và hai hàng chục người khác.

Tôi có một cửa sổ 7 chạy điều này + wamp 2.5 mà chạy php 5.5.12

+0

Đây là ảnh chụp màn hình của dấu nhắc lệnh, http://prntscr.com/9ul9yh –

+0

Xấu hổ bạn không theo liên kết ở cuối bài viết bạn đã trích dẫn - http://smallvoid.com/article/winnt- network-connection-limit.html – symcbean

+0

buddy, tôi đã thực sự và tôi mệt mỏi khi thêm các từ D đã đề cập. nhưng không sử dụng! Tôi đang sử dụng windows 8 như một máy chủ, bạn có thể giúp đỡ? –

Trả lời

0

Nó không có gì để làm với mã của bạn, đó là một "tính năng" của MS Windows để làm cho bạn mua phiên bản máy chủ (hoặc nâng cấp lên một hệ điều hành khác). Chức năng không có sự khác biệt giữa các phiên bản máy chủ và máy tính để bàn của hạt nhân NT (một số tinh chỉnh tối ưu khác nhau) của nó chỉ là một phương tiện đảm bảo bạn tuân thủ các điều khoản của giấy phép.

+0

Tôi thực sự đã thử điều này rất giống nhau trên một máy chủ cửa sổ từ Azure, cùng một điều! Tôi nên tìm loại máy chủ nào cho bất kỳ thông số kỹ thuật nào đó? –

+1

@DragonWarrior Get linux;) Windows là loại vô dụng đối với một máy chủ nếu bạn không có ý định chạy IIS. – RandomSeed

Các vấn đề liên quan