laravel-s 实现websocket客户端 swoole 自定义进程 $process-read() 阻塞
问题描述
自定义进程创建websoket客户端,while (true)维护与websoket服务端的连接。
外部输入订阅信息到进程,$process->read()阻塞,看资料read()是可以异步的,不知道可不可以解决这个问题。
新手小白,莫笑。
Swoole版本,PHP版本,以及操作系统版本信息
swoole 4.5.3 / php7.4.8 / Ubuntu 20.04
public static function callback(Server $swoole, Process $process)
{
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);
}
期待的结果
能够异步接收数据
推荐文章: