Рубрики
Uncategorized

Таймер MS для обучения свулу (7)

Автор оригинала: 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/”