2015-12-08 32 views
1

我有一个使用stream_socket_server()创建的TCP服务器。然后我有一个无尽的循环呼吁stream_socket_accept()。到目前为止,这是工作,并接受尽可能多的连接,我扔在它。但是,如果我尝试存储接受的连接,例如在数组中,stream_socket_accept()函数会停止接受进一步的连接。只有在将数据流资源添加到数组()时,才会发生这种情况。这里有一个例子:如何在PHP中存储多个流套接字资源?

<?php 
$errcode = $errmsg = null; 
$sock = stream_socket_server('tcp://0.0.0.0:65000', $errcode, $errmsg, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN); 
if ($sock === false) { 
    stream_set_blocking($sock, 0); 
} 

$storage = array(); 
for (;;) { 
    $con = @stream_socket_accept($sock, 0); 

    if ($con !== false) { 
     echo "Connection received\n"; 
     $storage[] = $con;//After this line, some of the next stream_socket_accept will not accept further connections 
     $con = @stream_socket_accept($sock, 0); 
    } 
    usleep(20000); 
} 

您可以打开很多像这样的连接(在bash/zsh,使用/不管)测试脚本:

for a in {1..100}; do telnet localhost 65000 &; done 

什么是更加古怪的是,如果我尝试打开100间的连接,从浏览器中,只有一个会被接受:

for (var x = 0; x < 100; x++) { 
    var sock = new WebSocket("ws://localhost:65000", "echo"); 
} 

要进行测试,保存的JavaScript上面谷歌浏览器的一个片段,并运行它。请注意,如果未将连接添加到$storage阵列中,则JavaScript代码也将接受所有100个已接受的连接尝试,谢谢!

任何帮助表示赞赏。

回答

0

最有可能接受的连接资源,当没有存储,都自动关闭,释放不再被引用后,由于分配到相同的资源变量新stream_socket_accept(),所以,有没有一百连接在同一时间。你的设置不支持那么多。