繼上篇 2018年swoole實(shí)戰(zhàn)2-異步非阻塞投遞任務(wù)
項(xiàng)目中需要使用定時(shí)器時(shí)栅葡,crontab是常用的選擇频祝,不過(guò)crontab的粒度太大旋炒,最小時(shí)間單位是分鐘級(jí)別步悠,如果我們要設(shè)置秒級(jí),甚至毫秒級(jí)的定時(shí)器瘫镇,crontab就愛(ài)莫能助了鼎兽,而且crontab是在服務(wù)器設(shè)置,脫離了業(yè)務(wù)代碼铣除,增加了維護(hù)成本谚咬。
swoole內(nèi)置了 異步毫秒定時(shí)器,一看這名稱(chēng)就覺(jué)得酷炫狂霸拽
老規(guī)矩尚粘,繼續(xù)用大劉的《三體》作為場(chǎng)景模擬:
服務(wù)端
新建 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();
}
/**
* 監(jiān)聽(tīng)連接事件
* @param $ws
* @param $request
*/
public function onOpen($ws, $request) {
}
/**
* 監(jiān)聽(tīng)數(shù)據(jù)發(fā)送事件
* @param $ws
* @param $frame
*/
public function onMessage($ws, $frame) {
$timer = swoole_timer_tick(1000, function() use ($ws, $frame){
$time = date("H:i:s");
$message = "水滴穿過(guò)人類(lèi)星際飛船择卦,猶如石頭穿過(guò)水中一樣,一連串的飛船都報(bào)廢了... {$time}";
$ws->push($frame->fd, $message);
});
swoole_timer_after(5000, function() use($ws, $frame, $timer) {
$ws->push($frame->fd, "攻擊結(jié)束郎嫁,除了藍(lán)色空間和青銅時(shí)代兩艘飛船逃逸之外秉继,其他都掛了,地球文明快完蛋了" . date('H:i:s'));
swoole_timer_clear($timer);
});
$ws->push($frame->fd, "水滴已經(jīng)被人類(lèi)捕獲泽铛,開(kāi)始啟動(dòng)攻擊指令尚辑,他們還以為是我們送來(lái)的表示和平的禮物,甚至稱(chēng)其為圣母的眼淚厚宰,哈哈哈...");
}
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) // 建立請(qǐng)求連接
webSocket.onopen = function(evt) {
let message = "與三體世界建立連接"
webSocket.send(message); // 發(fā)送數(shù)據(jù)到服務(wù)端
}
webSocket.onmessage = function(evt) { // 接收服務(wù)端數(shù)據(jù)
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("連接出錯(cuò):" + message)
}
</script>
</body>
</html>
啟動(dòng)服務(wù)
? 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
定時(shí)器
如果覺(jué)得本文對(duì)你有所幫助腌巾,點(diǎn)個(gè)贊遂填,或者賞杯咖啡錢(qián),你的認(rèn)可對(duì)我很重要