请教ws断开后redis链接如何删除?

m15800825437@163.com

使用workerman实现了websocket服务端

业务中使用了
use Workerman\RedisQueue\Client;

在onClose内部关闭connection

$ws->onClose = function($connection)
{
    $connection->close();
    unset($connection);
};

但是运行 php demo.php connections时
redis链接并没有被关闭掉
截图

请教下如何关闭它们。否则多次链接之后,redis进程越来越多了

1044 3 2
3个回答

walkor 打赏

Workerman\RedisQueue\Client本身是复用连接的,不会建立很多连接。Workerman\RedisQueue\Client目前不支持关闭,

$ws->onClose = function($connection)
{
    $connection->close();
    unset($connection);
};

另外这个代码是关闭客户端ws连接,并不是关闭Workerman\RedisQueue\Clientunset($connection);这句没有必要,$connection在函数里是临时变量,出了函数作用域自然就释放了.

“否则多次链接之后,redis进程越来越多了”
这个也是错误说法,多次连接不会影响进程数,进程和连接是有区别的。进程数是固定的,启动后就不会变动了。
客户端多次连接,不影响Workerman\RedisQueue\Client连接数,Workerman\RedisQueue\Client会复用连接。开发过程中不用关注Workerman\RedisQueue\Client的连接数。

  • m15800825437@163.com 2022-05-04

    感谢回复,也就是说我这边其实不用关注 redis的连接数,它内部自己会复用

  • walkor 2022-05-04

  • walkor 2022-05-04

    Workerman\RedisQueue\Client 一般是放在onWorkerStart进程启动时初始化的,一个进程只会执行一次。不要重复初始化就行。

请教大佬,如下这样使用是否正确哦?

$ws->onWorkerStart = function() {
    global $asyncRedisQueue;
    $asyncRedisQueue = new AsyncRedisQueue('redis://127.0.0.1:6379');
};

$ws->onConnect = function($connection)
{
    // WebSocket连接成功
    $connection->onWebSocketConnect = function($connection)
    {
        global $asyncRedisQueue;
        // 订阅并推送消息
        $asyncRedisQueue->subscribe('Message:Center:Queue:' . $connection->id, function($info_json) use ($connection) {
            $connection->send($info_json);
        });
    };
};

$ws->onClose = function($connection)
{
    $connection->close();
};
  • walkor 2022-05-04

    连接关闭的时候取消对应的订阅,不然订阅越来越多,占用内存越来越大,这种算内存泄漏

谢谢大佬提点,已经改正

$ws->onWorkerStart = function() {
    global $asyncRedisQueue;
    $asyncRedisQueue = new AsyncRedisQueue('redis://127.0.0.1:6379');
};

$ws->onConnect = function($connection)
{
    // WebSocket连接成功
    $connection->onWebSocketConnect = function($connection)
    {
        global $asyncRedisQueue;
        // 订阅并推送消息
        $asyncRedisQueue->subscribe('Message:Center:Queue:' . $connection->id, function($info_json) use ($connection) {
            $connection->send($info_json);
        });
    };
};

$ws->onClose = function($connection)
{
    global $asyncRedisQueue;
    // 取消订阅
    $asyncRedisQueue->unsubscribe('Message:Center:Queue:' . $connection->id);
    $connection->close();
};
  • 暂无评论
年代过于久远,无法发表回答
×
🔝