### 问题描述
从redis中取出多个房间号来开启websocket-client进行监听
websocket客户端是从http客户端的协程池中取出后升级而成
监听开启后同时监听多个房间并获取数据
而后需要根据redis中的房间号对应的值来关闭监听
问题就是:当关闭其中某一个监听并归还连接时所有房间都停止了监听
### Swoole版本,PHP版本,以及操作系统版本信息
swoole4.4.13
php7.2
centos7(windows下vagrantbox虚拟机)
### 相关代码
```php
//http_client协程池
class Pool
{
protected static $instance;
protected $channel;
public static function i():self
{
return static::$instance ?? (static::$instance = new static());
}
public function __construct(int $size = 10)
{
$this->channel = new Swoole\Coroutine\Channel($size);
$host = 'www.test.com';
$port = 80;
while($size--){
$cli = new Swoole\Coroutine\Http\Client($host,$port);
if($cli){
$this->put($cli);
}else{
throw new RuntimeException($cli->errCode);
}
}
}
public function put(Swoole\Coroutine\Http\Client $client): void
{
$this->channel->push($client);
}
public function get(float $timeout = -1): Swoole\Coroutine\Http\Client
{
return $this->channel->pop($timeout) ?: null;
}
public function close(Swoole\Coroutine\Http\Client $client)
{
$client->close();
$this->channel->close();
}
}
//
Co\Run(function (){
$redis = new Swoole\Coroutine\Redis();
$redis->setOptions(
[
'connect_timeout' => 1,
'time_out' => 3,
]
);
$redis->connect('127.0.0.1',6379);
$redis->auth(123456);
//取出所有房间
$key = 'rooms';
$roomids = $redis->hKeys($key);
Pool::i();
foreach ($roomids as $roomid){
//过滤掉不用监听的房间
if($redis->hGet($key,$roomid) == 0){
continue;
}
go(function () use ($roomid,$redis){
//取出一个连接
$pool = Pool::i();
$cli = $pool->get();
//建立ws连接
$ret = $cli->upgrade('/'.$roomid);
swoole_timer_tick(5000,function () use ($pool,$roomid,$redis,$cli){
//每5秒发送一次ping 保持心跳连接
$cli->push('ping');
//检测房间是否要停止监听
if($redis->hget('laravel_database_desire_tree_rooms',$roomid) == 0){
//归还连接
$pool->put($cli);
//关闭连接
$pool->close($cli); //关闭其中一个后其他正在监听的连接都断掉了 无法获取数据
}
});
if ($ret) {
while(true) {
//接收获取数据
if($recvData = $cli->recv()){
var_dump($data = json_decode($recvData->data));
}
}
}
});
}
});
```
### 你期待的结果是什么?实际看到的错误信息又是什么?
解决关闭其中某个websocket——client连接 而不影响其他的监听
希望有老师同学能帮忙指点一下 感谢!