workerman怎么判断连接状态
1. 运行环境
windows 10,php 7.3,workerman 4.1,laravel 8
2. 问题描述?
需要做一个实时更新的报价盘,前端用websockt连接服务器,连接成功后每秒给前端发送最新的数据,但是服务器是windows,在laravel中用workerman的Timer类报错pcntl_alarm()未被定义,然后考虑用while sleep循环,但是在postman测试时发现连接断开,循环还在不停推送,不知道怎么实时检测连接是否断开,然后停掉循环,是哪里用法不对嘛,新手菜鸡,希望大佬指点一下。
Command
<?php
namespace App\Console\Commands;
use GuzzleHttp\Client;
use Illuminate\Console\Command;
use Workerman\Connection\TcpConnection;
use Workerman\Worker;
class websocket extends Command
{
protected $signature = 'websocket';
protected $description = 'websocket';
public function __construct()
{
parent::__construct();
}
public function handle()
{
$ws_worker = new Worker("websocket://0.0.0.0:8080");
$ws_worker->name = 'WebsocketWorker';
$ws_worker->onMessage = function(TcpConnection $connection, $data){
while (true) {
if ($connection->getStatus()!==TcpConnection::STATUS_ESTABLISHED){
break;
}
$data = $this->GetGoldPrictOne();
if ($data) {
$connection->send(json_encode($data));
}
sleep(1);
}
};
$ws_worker->onConnect = function(TcpConnection $connection) {
$connection->send('Welcome to the WebSocket server!');
};
$ws_worker->onClose = function(TcpConnection $connection) {
echo "Connection closed\n";
};
Worker::runAll();
$this->info('WebSocket server started successfully.');
}
心跳检测
windows 不支持 pcntl,wokerman 推荐用 linux
windows装个docker给服务扔容器里面.
我能想到的是,用我这个包或者采用轮询方案,window限制了。
用go写gateway(安装即可),用php快速实现websocket业务
gateway是现成的,只需实现php业务。
直接两个端一直互发消息不就已经达到需求了?