1. Выполнение асинхронных задач
В серверной программе, если вам нужно выполнить трудоемкие операции, такие как сервер чата для отправки широковещательной передачи, веб-сервер для отправки почты. Если эти функции выполняются напрямую, текущий процесс будет заблокирован, что приведет к медленной реакции сервера.
Вулф предоставляет функцию асинхронной обработки задач, которая может отправлять асинхронную задачу в пул рабочих процессов задач для выполнения, не влияя на скорость обработки текущего запроса.
Как использовать:
- онТаск
- Онфиниш
- Установите номер рабочего задания
2, Реализация кода
Давайте посмотрим Руководство по введению в официальный документ swool – > быстрый запуск – > задача для выполнения асинхронных задач
Мы можем использовать класс websocket :
ws_task. 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");
}
/**
*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);
$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();Статическая страница переднего плана: ws_task_client.html
WebSocket TEST
Swoole-TEST
Сначала мы запустили сервис websocket:
# php ws_task.php
Затем запустите задачу WS client.html страница в браузере:
Теперь давайте рассмотрим печать на сервере:
# php ws_task.php Open:3 ser-push-message:Hello-Lily clientid-1 is closed taskId:0 finish-data-success:on task finish
Мы видим, что сообщение на странице отвечает вовремя, а асинхронная задача на стороне сервера занимает 10 секунд для вывода.