TP6+think-swoole实践(⼆)
swoole 在 TP 中的⽤法⼤概可以归为三类:listen(监听)、subscribe(订阅)、task(任务)。先说⼀下 listen 和 subscribe,这两种也是各种教程上出现最频繁的。
这三类⽤法,本质上都是使⽤ TP6 的“事件”实现的。简单的来说,就是我们先定义⼀些事件,然后注册listen监听或者subscribe订阅事件(在event.php中),之后就可以通过内部调⽤来触发事件了。
// 触发UserLogin事件
Event::trigger('UserLogin');
// 或者使⽤助⼿函数
event('UserLogin');
// 或者直接使⽤事件类触发
event('app\event\UserLogin');
swoole ⽤起来也和事件差不多,先注册,然后编写代码,再通过外部访问触发事件。
listen
1. 注册
注册可以使⽤ think-swoole ⾃带的⽅式,也可以在 event.php 中进⾏注册。
<?php
// 事件定义⽂件 event.php
return[
'bind'=>[
],
'listen'=>[
//监听连接,swoole 事件必须以 swoole 开头,事件的⾸字母需要⼤写
'swoole.websocket.Test'=>[
app\listener\WebsocketTest::class
],
],
]
;
2. 创建监听事件
可以直接在app⽬录下创建listener⽬录,并且新建需要的类⽂件,开始编写代码;也可以进⼊项⽬⽬录,直接使⽤命令快捷⽣成:php think make:listener WebsocketTest
3. 编写代码,实现功能
创建成功后,每次触发事件都会执⾏ handle ⽅法
class WebsocketTest
{
public$websocket=null;
/**
* 注⼊容器管理类,从容器中取出Websocket类,或者也可以直接注⼊Websocket类,
*/
public function__construct(Container $container)
{
$this->websocket=$container->make(Websocket::class);
}
/**
* 事件监听处理
*
* @return mixed
*/
public function handle($event)
{
/
/回复客户端消息
$this->websocket->emit("testcallback",['aaaaa'=>1,'getdata'=>$event['asd']]);
}
}
4. 外部访问
以下提供 socket.io 和 websocket 两种 demo。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="cdn.socket.io/socket.io-1.4.4.js"></script>
<script src="code.jquery/jquery-1.11.1.js"></script>
</head>
<body>
<div>
<div>
返回内容:
</div>
<div id="content">
</div>
</div>
<div>
在控制台中执⾏ it("test",{"asd":"我是内容"})
</div>
<script>
const socket =io('127.0.0.1:39992');
<("testcallback",function(res){
console.log(res)
$('#content').html($('#content').html()+JSON.stringify(res)+"<br>"); });
</script>
</body>
</html>
<html>
前端websocket怎么用
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
消息:<input type="text"id="message">
接收者:<input type="text"id="to">
<button onclick="send()">发送</button>
<div>
或者在控制台中执⾏ ws.send(JSON.stringify(['test',{
to:to,
message:message
}]));
</div>
<script>
var ws =new WebSocket("ws://127.0.0.1:9501/");
console.log('连接成功');
}
console.log(data);
}
console.log('连接断开');
}
function send()
{
var message = ElementById('message').value;
var to = ElementById('to').value;
console.log("准备给"+ to +"发送数据:"+ message);
ws.send(JSON.stringify(['test',{
//这⾥可以⾃⼰定义事件
to:to,
message:message
}]));//发送的数据必须是 "['test',数据]" 这种格式
}
</script>
</body>
</html>
5. 内部访问
毕竟是 TP6 ⾃带的事件,当然也可以通过⾃带的⽅法进⾏内部访问的了,只要在需要调⽤的地⽅使⽤上⽂提到的事件调⽤⽅法就可以了:
Event::trigger('swoole.websocket.Test');
subscribe
订阅事件和监听事件使⽤起来很像,两者的区别是,listen 只是监听⼀个事件,⽽ subscribe 是在⼀个中监听多个事件。这⼀点在⽤法上可以很明显地体现,listen 监听的事件,只能触发 handle 这⼀个⽅法;⽽通过订阅,可以选择触发不同的⽅法。