Автор оригинала: David Wong.
1, Установите таймер
Мы обычно используем таймер, который поставляется с системой Linux, когда мы имеем дело с обычными задачами синхронизации crontab Для выполнения, но иногда он не может соответствовать вашим бизнес-требованиям и не может достичь миллисекундного уровня. Однако swole может помочь нам в его реализации.
Давайте посмотрим официальное руководство по вводу документов swoole – > быстрый старт – > установить таймер
Swool предоставляет JavaScript,такой как асинхронный высокоточный таймер setinterval/setTimeout, с детализацией в миллисекунды. Он также очень прост в использовании.
Функция swoole_timer_tickэквивалентна функции setinterval, которая запускается непрерывноФункция swoole_timer_afterэквивалентна функции setTimeout, которая запускается только один раз в согласованное времяswoole_timer_tickиswoole_timer_послеФункция возвращает целое число, представляющее идентификатор таймера
Этот таймер можно очистить с помощью swoole? Таймер? Четкий. Параметр-идентификатор таймера
2, Реализация кода
w_таймер. php
ws = new swoole_websocket_server("0.0.0.0", 80);
$this->ws->set(
[
'enable_static_handler' = > true, // static resource related settings
'document_root' = > "/ work / study / code / swoole / demo / static", // store static resource path
// 'worker_num' => 2,
// 'task_worker_num' => 2,
]
);
$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();
}
/**
*Listen for WS connection events
* @param $ws
* @param $request
*/
public function onOpen($ws, $request)
{
print_r("Open:" . $request->fd ."\n");
//Using scheduled tasks
if($request->fd == 1)
{
//Every 2 seconds
swoole_timer_tick(2000, function($timer_id){
echo "2s:timerId:{$timer_id}";
});
}
}
/**
*Listen for WS connection messages
* @param $ws
* @param $frame
*/
public function onMessage($ws, $frame)
{
echo "ser-push-message:{$frame->data}\n";
//Todo:: it takes more than 10s to join our business, so you can use task asynchrony to process
$data = [
'task' => 1,
'fd' => $frame->fd,
];
//Deliver a task
// $ws->task($data);
//The timing task is executed after 5S. This is an asynchronous task and will not block. The closure is used here
swoole_timer_after(5000, function() use ($ws, $frame){
echo "5s-after\n";
$ws->push($frame->fd, "server-time-after");
});
$ws->push($frame->fd, "server-push:".date("Y-m-d H:i:s"));
}
/**
*Delivery task
*
* @param $serv
* @param $taskId
* @param $workerId
* @param $data
*/
public function onTask($serv, $task_id, $from_id, $data)
{
//Time consuming scenario 10s
sleep(10);
Return "on task finish"; // tell worker
}
public function onFinish($serv, $task_id, $data)
{
echo "taskId:{$task_id}\n";
//Note: this $data parameter is the result returned by the on task method: on task finish, not the parameter of the ontask method.
echo "finish-data-success:{$data}\n";
}
/**
*Listen for websocket connection closing events
*
* @param $ws
* @param $fd
*/
public function onClose($ws, $fd)
{
echo "clientid-{$fd} is closed \n";
}
}
$ws_obj = new Ws();Выполните сценарий на стороне сервера:
[email protected]:/work/study/code/swoole/demo/server# php ws_timer.php Open:3 ser-push-message:Hello-Lily clientid-1 is closed 5s-after clientid-2 is closed
Выполнение клиентского кода в браузере: задача WS Выполнение клиентского кода в браузере: задача WS
Мы видим, что после открытия браузера и ожидания в течение 5 секунд сервер серверное время-после Информация передается клиенту.
Оригинал: “https://developpaper.com/ms-timer-for-swoole-learning-7/”