Home
Download
Document
Forum
Video
Donate
Source Code
AI 助理
Sponsors
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
Products
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
Login
Register
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
开启两个一直占用不退出的协程,CPU 占用 100%
### 问题描述 为了和 Websocket 服务器建立长链接,接受推送消息,开启两个协程,过了两天,发现CPU占用 100% ### Swoole版本,PHP版本,以及操作系统版本信息 PHP: 7.2.33 Swoole:4.5.5 ### 相关代码 ```php $client = new Client('openapi.dianping.com', 80); $params['app_key'] = $this->appKey; $params['v'] = '1.0'; $params['timestamp'] = date('Y-m-d H:i:s'); $params['type'] = 'ALL'; $sign = $this->makeSign($params); $params['sign'] = $sign; $ret = $client->upgrade('/message/websocket?'.http_build_query($params)); Coroutine::create(function () use ($client, $ret) { if ($ret) { while(true) { $client->push('hello'); Coroutine::sleep(5); } } }); Coroutine::create(function () use ($client, $ret) { $guzzleClient = new GuzzleClient([ 'base_uri' => config('websocket.tuangou_callback_url'), 'timeout' => 5, 'verify' => false ]); if ($ret) { while(true) { $res = $client->recv(); var_dump($res); if ($res && $res->data) { $this->logger->info("美团团购消息".$res->data); $resBody = $guzzleClient->post('v1/callback/meituan-un-bind', ['form_params' => ['data' => $res->data]]); $resData = json_decode((string)$resBody->getBody(), true); $this->logger->info("推送结果".$resBody->getBody()); var_dump($resBody->getBody()); if ($resData && isset($resData['code']) && ($resData['code'] == 200)) { $msgData = json_decode($res->data, true); if (isset($msgData['msg_id']) && isset($msgData['type'])) { $client->push(json_encode([ 'msgId' => $msgData['msg_id'], 'type' => $msgData['type'], 'msg' => 'ack' ])); } } } } } }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么?
发布于2年前 · 47 次浏览 · 来自
提问
掸尘
### 问题描述 为了和 Websocket 服务器建立长链接,接受推送消息,开启两个协程,过了两天,发现CPU占用 100% ### Swoole版本,PHP版本,以及操作系统版本信息 PHP: 7.2.33 Swoole:4.5.5 ### 相关代码 ```php $client = new Client('openapi.dianping.com', 80); $params['app_key'] = $this->appKey; $params['v'] = '1.0'; $params['timestamp'] = date('Y-m-d H:i:s'); $params['type'] = 'ALL'; $sign = $this->makeSign($params); $params['sign'] = $sign; $ret = $client->upgrade('/message/websocket?'.http_build_query($params)); Coroutine::create(function () use ($client, $ret) { if ($ret) { while(true) { $client->push('hello'); Coroutine::sleep(5); } } }); Coroutine::create(function () use ($client, $ret) { $guzzleClient = new GuzzleClient([ 'base_uri' => config('websocket.tuangou_callback_url'), 'timeout' => 5, 'verify' => false ]); if ($ret) { while(true) { $res = $client->recv(); var_dump($res); if ($res && $res->data) { $this->logger->info("美团团购消息".$res->data); $resBody = $guzzleClient->post('v1/callback/meituan-un-bind', ['form_params' => ['data' => $res->data]]); $resData = json_decode((string)$resBody->getBody(), true); $this->logger->info("推送结果".$resBody->getBody()); var_dump($resBody->getBody()); if ($resData && isset($resData['code']) && ($resData['code'] == 200)) { $msgData = json_decode($res->data, true); if (isset($msgData['msg_id']) && isset($msgData['type'])) { $client->push(json_encode([ 'msgId' => $msgData['msg_id'], 'type' => $msgData['type'], 'msg' => 'ack' ])); } } } } } }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么?
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2022-03-10
自在侠
CPU 100% 肯定不是这个导致。你还是从其它源头查查吧
赞
0
回复
2022-04-07
掸尘
## 继续补充信息 ![](/storage/article-column/JFjK6vpRvOTTGW8kQlbpTJ2MFBIA0BZVVVaLG29W.png) ![](/storage/article-column/98UqQ6eHSkpvXdv7fFDcgZ6N8YVbX9Jidmcgziu2.png)
赞
0
回复
2022-04-07
宇润
需要在 `recv()` 处做判断,长连接要有断线重连逻辑 http://wiki.swoole.com/#/coroutine_client/http_client?id=recv `recv()` 失败返回 `false`,并检查 `Swoole\Coroutine\Http\Client` 的 `errCode` 属性,协程客户端没有 `onClose` 回调,连接被关闭 recv 时返回 false 并且 errCode=0
赞
0
回复
微信公众号
热门内容
作者其它话题
- Timer 计时器内部是如何实现的
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。