swoole学习之 websocket中task任务使用案例
websocket基础类增加task方法
<?php
/*优化websocket基础类
*
* */
class WsTask
{
//定义host
const HOST = '0.0.0.0';
//定义端口号
const PORT = 9502;
//定义变量
public $ws = '';
//构造函数
public function __construct()
{
$this->ws = new Swoole\WebSocket\Server(self::HOST, self::PORT);
//设置参数
$this->ws->set([
'worker_num' => 2,//设置进程数
'task_worker_num' => 2//设置task进程数
]);
//定义方法
$this->ws->on('open', [$this, 'onOpen']);
$this->ws->on('message', [$this, 'onMessage']);
//异步任务
$this->ws->on('task', [$this, 'onTask']);
//异步任务对应的结束方法
$this->ws->on('finish', [$this, 'onFinish']);
$this->ws->on('close', [$this, 'onClose']);
//启动服务
$this->ws->start();
}
//定义链接websocket服务事件的方法
public function onOpen($ws, $request)
{
echo "得到客户端的request请求<pre>";
print_r($request);
}
//定义websocket服务消息事件的方法
public function onMessage($ws, $frame)
{
//加入要执行的任务
$task_data = array(
'task' => 1,
'fd' => $frame->fd,
);
//执行任务
$ws->task($task_data);
echo '获取到客户端发送过来的数据' . $frame->data;
//给客户端回应,发送内容
$ws->push($frame->fd, 'wesocketServe-push-data:www.qipa250.com');
}
//定义异步task任务方法
public function onTask($ws, $taskId, $workerId, $task_data)
{
echo "<pre>";
print_r($task_data);
echo '开始时间' . date('Y-m-d H:i:s', time()) . PHP_EOL;
sleep(10);
echo '结束时间' . date('Y-m-d H:i:s', time()) . PHP_EOL;
return '执行finish方法';
}
//定义任务结束方法
public function onFinish($ws, $taskId, $data)
{
echo '$taskId=' . $taskId . PHP_EOL;
echo 'finish-data-sucess=' . $data . PHP_EOL;
}
//定义关闭websocket服务的方法
public function onClose($ws, $fd)
{
echo '客户端:' . $fd . '断开了websocket服务!';
}
}
//实例化
$ws = new WsTask();
?>
此段代码还是基于httpserver的,所以要启动httpserver服务
php server/httpService.php
再启动websocket服务
php server/websocket.task.php
客户端websocket.html 代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>swoole学习之websocket_server服务器代码_徊忆羽菲的博客-CSDN博客</title>
</head>
<body>
<h1>websocket服务器基础类task异步任务测试</h1>
<script type="application/javascript">
//定义一个websocket服务器的路径
var wsUrl = 'ws://20.20.24.131:9502';
var ws_server = new WebSocket(wsUrl);
//实例化open属性 判断是否链接websocket成功
ws_server.onopen = function (evt) {
//发送数据
ws_server.send('hello websocket!');
console.log('connect-swoole-websocket-success');
}
//实例化onmessage
ws_server.onmessage = function (evt) {
console.log('connect-swoole-websocket-message', evt.data);
}
//实例化close
ws_server.onclose = function (evt) {
console.log('connect-swoole-websocket-close');
}
//实例化close
ws_server.onerror = function (evt, e) {
console.log('connect-swoole-websocket-error', e.errorCode);
}
</script>
</body>
</html>
效果
在浏览中访问
http://20.20.24.131:9501/websocket.html
可以看到,客户端,很快收到了服务端发送的数据,并没有等待10秒
而服务端收到客户端的数据并打印
可以看到服务端优先给客户端返回数据之后,等待了10s,再去执行了finish方法