Рубрики
Uncategorized

Задача Свула задача обучения свулу (6)

Автор оригинала: David Wong.

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 секунд для вывода.