首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PHP中存储多数据流socket资源?

如何在PHP中存储多数据流socket资源?
EN

Stack Overflow用户
提问于 2015-12-08 08:33:18
回答 1查看 291关注 0票数 1

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

代码语言:javascript
复制
<?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/任何位置):

代码语言:javascript
复制
for a in {1..100}; do telnet localhost 65000 &; done

更奇怪的是,如果我试图从浏览器打开100个连接,只有一个会被接受:

代码语言:javascript
复制
for (var x = 0; x < 100; x++) {
    var sock = new WebSocket("ws://localhost:65000", "echo");
}

要测试这一点,请将上面的JavaScript作为代码片段保存在Google Chrome中并运行它。注意,如果连接没有添加到$storage数组中,JavaScript代码也会接受100次连接尝试,谢谢!

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2018-07-22 00:41:11

我不明白你为什么在第15行有另一个stream_socket_accept,你应该只有一个。

您还可以添加一个超时,例如1 (second)而不是您的0,并删除@,因为它是一个糟糕的实践(您可能有一个大问题,并且永远不知道它):$con = stream_socket_accept($sock, 1);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34145986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档