gpt4 book ai didi

javascript - PHP中如何存储多个流套接字资源?

转载 作者:行者123 更新时间:2023-11-28 06:37:27 25 4
gpt4 key购买 nike

我有一个使用 stream_socket_server() 创建的 TCP 服务器。然后我有一个无限循环调用stream_socket_accept()。到目前为止,这是有效的,并且接受我输入的尽可能多的连接。但是,如果我尝试将接受的连接存储在数组中,例如,stream_socket_accept() 函数将停止接受进一步的连接。仅当我将流资源添加到 array() 时才会发生这种情况。这是一个例子:

<?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/whatever 中):

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 保存为 Google Chrome 中的代码片段并运行它。请注意,如果连接未添加到 $storage 数组中,JavaScript 代码也会接受所有 100 次连接尝试,谢谢!

感谢任何帮助。

最佳答案

很可能接受的连接资源,在未存储时,由于分配给同一资源的新 stream_socket_accept() 而不再被引用后,会自动关闭并释放变量,这样就不会同时有一百个连接。您的设置不支持那么多。

关于javascript - PHP中如何存储多个流套接字资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34145986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com