项目中需要使用定时器时,crontab是常用的选择,不过crontab的粒度太大,最小时间单位是分钟级别,如果我们要设置秒级,甚至毫秒级的定时器,crontab就爱莫能助了,而且crontab是在服务器设置,脱离了业务代码,增加了维护成本。
swoole内置了 异步毫秒定时器,一看这名称就觉得酷炫狂霸拽
老规矩,继续用大刘的《三体》作为场景模拟:
服务端
新建 server.php
<?php
class WebSocket {
const HOST = '0.0.0.0';
const PORT = 8812;
public $ws = null;
public function __construct()
{
$this->ws = new swoole_websocket_server(self::HOST, self::PORT);
$this->ws->set(
[
'worker_num' => 2,
]
);
$this->ws->on('open', [$this, 'onOpen']);
$this->ws->on('message', [$this, 'onMessage']);
$this->ws->on('close', [$this, 'onClose']);
$this->ws->start();
}
/**
* 监听连接事件
* @param $ws
* @param $request
*/
public function onOpen($ws, $request) {
}
/**
* 监听数据发送事件
* @param $ws
* @param $frame
*/
public function onMessage($ws, $frame) {
$timer = swoole_timer_tick(1000, function() use ($ws, $frame){
$time = date("H:i:s");
$message = "水滴穿过人类星际飞船,犹如石头穿过水中一样,一连串的飞船都报废了... {$time}";
$ws->push($frame->fd, $message);
});
swoole_timer_after(5000, function() use($ws, $frame, $timer) {
$ws->push($frame->fd, "攻击结束,除了蓝色空间和青铜时代两艘飞船逃逸之外,其他都挂了,地球文明快完蛋了" . date('H:i:s'));
swoole_timer_clear($timer);
});
$ws->push($frame->fd, "水滴已经被人类捕获,开始启动攻击指令,他们还以为是我们送来的表示和平的礼物,甚至称其为圣母的眼泪,哈哈哈...");
}
public function onClose($ws, $fd) {
}
}
$obj = new WebSocket();
客户端
新建 client.html
<!doctype html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>webSocket客户端</title>
</head>
<body>
<script>
let wsUrl = "ws://127.0.0.1:8812"
let webSocket = new WebSocket(wsUrl) // 建立请求连接
webSocket.onopen = function(evt) {
let message = "与三体世界建立连接"
webSocket.send(message); // 发送数据到服务端
}
webSocket.onmessage = function(evt) { // 接收服务端数据
let message = String(evt.data)
console.log(message)
}
webSocket.onclose = function(evt) {
console.log("地球与三体的连接已中断")
}
webSocket.onerror = function(evt, e) {
let message = String(evt.data)
console.log("连接出错:" + message)
}
</script>
</body>
</html>
启动服务
☁ ws php server.php
[2018-07-27 14:10:03 @62813.0] TRACE Create swoole_server host=0.0.0.0, port=8812, mode=3, type=1
如果觉得本文对你有所帮助,点个赞,或者赏杯咖啡钱,你的认可对我很重要