项目要用到消息提醒功能,因此借此机会学习websocket
回调版本websocket
<?php
//创建WebSocket Server对象,监听0.0.0.0:9502端口
$ws = new Swoole\WebSocket\Server('0.0.0.0', 9502);
//监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {
var_dump('客户连进来了');
$ws->push($request->fd, "hello, welcome\n");
});
//监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
echo "Message: {$frame->data}\n";
$ws->push($frame->fd, "server: {$frame->data}");
$ws->push($frame->fd, "i am coming");
});
//利用swoole的定时器,定时请求第三方接口,将数据实时推送到客户端即可;timer的简单用法
$ws->on('WorkerStart', function ($ws, $worker_id){
Swoole\Timer::tick(5000, function (int $timer_id, $ws) {
echo "timer_id #$timer_id, after 5000ms.\n";
foreach ($ws->connections as $fd){
var_dump($fd);
$rand = mt_rand(0,1000);
$ws->push($fd, $rand);
}
}, $ws);
});
//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
echo "client-{$fd} is closed\n";
});
$ws->start();
//主要是实现了隔5秒主动发消息到连接的客户
协程版本websocket
Co\run(function () {
$server = new Co\Http\Server('0.0.0.0', 9502, false);
$server->handle('/websocket', function ($request, $ws) {
$ws->upgrade();
while (true) {
$frame = $ws->recv();
if ($frame === '') {
$ws->close();
break;
} else if ($frame === false) {
echo "error : " . swoole_last_error() . "\n";
break;
} else {
if ($frame->data == 'close' || get_class($frame) === Swoole\WebSocket\CloseFrame::class) {
$ws->close();
return;
}
$ws->push("Hello {$frame->data}!");
$ws->push("How are you, {$frame->data}?");
}
var_dump($ws->fd);
Swoole\Timer::tick(5000, function (int $timer_id, $ws) {
echo "timer_id #$timer_id, after 5000ms.\n";
$rand = mt_rand(0,1000);
$ws->push($rand);
}, $ws);
}
});
$server->start();
});
网友评论