首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
websocket swoole 自定义进程 $process->read() 阻塞
### 问题描述 自定义进程创建websoket客户端,while (true)维护与websoket服务端的连接。 外部输入订阅信息到进程,$process->read()阻塞,看资料read()是可以异步的,不知道可不可以解决这个问题。 新手小白,莫笑。 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.5.3 / php7.4.8 / Ubuntu 20.04 ### 相关代码 ```php do { try { if (empty(self::$websocket)) { SaberGM::default(['exception_report' => 0, 'upgrade' => '/', 'ssl' => 1, 'ssl_verify_peer' => true, 'use_pool' => true]); self::$websocket = SaberGM::websocket(self::$stream); echo '创建websocket'.PHP_EOL; } $recv = self::$websocket->recv();// timeout' if (empty($recv->finish)) continue; $responseData = json_decode(self::gzdecode($recv), true); echo json_encode($responseData) .PHP_EOL; if (isset($responseData['ping'])) { self::$websocket->push(self::getPong($responseData['ping'])); echo self::getPong($responseData['ping']).PHP_EOL; } if (!$responseData) continue; // TODO 接收数据进行订阅 $process->read(); //阻塞了 } catch (\Exception $e) { echo 'websocket error:'.$e->getMessage().'|'.$e->getLine().PHP_EOL; self::$websocket = null; Coroutine::sleep(10); continue; } } while (true); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 能够异步接收数据
发布于4年前 · 1 次浏览 · 来自
提问
大L
### 问题描述 自定义进程创建websoket客户端,while (true)维护与websoket服务端的连接。 外部输入订阅信息到进程,$process->read()阻塞,看资料read()是可以异步的,不知道可不可以解决这个问题。 新手小白,莫笑。 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.5.3 / php7.4.8 / Ubuntu 20.04 ### 相关代码 ```php do { try { if (empty(self::$websocket)) { SaberGM::default(['exception_report' => 0, 'upgrade' => '/', 'ssl' => 1, 'ssl_verify_peer' => true, 'use_pool' => true]); self::$websocket = SaberGM::websocket(self::$stream); echo '创建websocket'.PHP_EOL; } $recv = self::$websocket->recv();// timeout' if (empty($recv->finish)) continue; $responseData = json_decode(self::gzdecode($recv), true); echo json_encode($responseData) .PHP_EOL; if (isset($responseData['ping'])) { self::$websocket->push(self::getPong($responseData['ping'])); echo self::getPong($responseData['ping']).PHP_EOL; } if (!$responseData) continue; // TODO 接收数据进行订阅 $process->read(); //阻塞了 } catch (\Exception $e) { echo 'websocket error:'.$e->getMessage().'|'.$e->getLine().PHP_EOL; self::$websocket = null; Coroutine::sleep(10); continue; } } while (true); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 能够异步接收数据
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2020-10-16
鲁飞
协程和异步不建议混用。
赞
0
回复
微信公众号
热门内容
暂无回复的问答
- 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一直是同一个。没用使用到多进程啊。