Swoole—WebSocket—Task任务使用

Posted willem_chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swoole—WebSocket—Task任务使用相关的知识,希望对你有一定的参考价值。

使用场景:

执行耗时操作(发送邮件 广播等)

如何使用
onTask
onFinish
设置task_worker_num

应用

Ws.php

<?php
/*ws 优化 基础类库*/
class Ws{
  CONST HOST = "0.0.0.0";
  CONST PORT = 8812;
  public $ws = null;
  public function __construct(){
    $this->ws = new Swoole\\WebSocket\\Server("0.0.0.0",8812);
    
    $this->ws->set(
      [
        # 设置启动的 Worker 进程数。【默认值:CPU 核数】
        'worker_num'=>2,
        # 配置 Task 进程的数量
        'task_worker_num'=>2,
      ]
    );

    $this->ws->on("open",[$this,"onOpen"]);
    $this->ws->on("message",[$this,"onMessage"]);

    /*
    调用 $serv->task() 后,程序立即返回,继续向下执行代码。onTask 回调函数 Task 进程池内被异步执行。执行完成后调用 $serv->finish() 返回结果。

    task()投递一个异步任务到 task_worker 池中。此函数是非阻塞的,执行完毕会立即返回。Worker 进程可以继续处理新的请求。使用 Task 功能,必须先设置 task_worker_num,并且必须设置 Server 的 onTask 和 onFinish 事件回调函数。

    onTask 在 task 进程内被调用。worker 进程可以使用 task 函数向 task_worker 进程投递新的任务。当前的 Task 进程在调用 onTask 回调函数时会将进程状态切换为忙碌,这时将不再接收新的 Task,当 onTask 函数返回时会将进程状态切换为空闲然后继续接收新的 Task。
     */
    $this->ws->on("task",[$this,"onTask"]); 
    $this->ws->on("finish",[$this,"onFinish"]);

    $this->ws->on("close",[$this,"onClose"]);
    $this->ws->start();
  }

  # 监听ws连接事件
  public function onOpen($ws,$request){
    var_dump($request->fd);
  }

  # 监听ws消息事件
  public function onMessage($ws,$frame){
    echo "接收到的信息:{$frame->data}\\n";
    // todo 10s
    $data = [
      'task'=>1,
      'fd'=>$frame->fd,
    ];
    $ws->task($data);
    $ws->push($frame->fd,"收到了:".date("Y-m-d H:i:s"));
  }

  public function onTask($serv,$taskId,$workerId,$data){
    print_r($data);
    //耗时场景
    sleep(30);
    return "on task finish 执行完了_".$workerId;//告诉work
  }

  public function onFinish($serv,$taskId,$data){
    echo "taskId:{$taskId}\\n";
    echo "finish-data-sucess:{$data}\\n";
  }

  # close
  public function onClose($ws,$fd){
    echo "client:{$fd}\\n";
  }

}

$obj=new Ws();

运行服务

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>client</title>
</head>

<h1>willem-swoole-ws测试</h1>

<script>
  var wsUrl = "ws://test.cc:8812";
  var websocket=new WebSocket(wsUrl);
  //实例对象的onopen属性
  websocket.onopen=function(evt){
    websocket.send("发送 hello-willem");
    console.log("conected-swoole-success");
  }
  //实例化 onmessage
  websocket.onmessage=function(evt){
	alert(evt.data+":接收到后端发来的信息弹窗");
    console.log("ws-server-return-data:"+evt.data);
  }
  //onclose
  websocket.onclose=function(evt){
    console.log("close");
  }
  //onerror
  websocket.onerror=function(evt,e){
    console.log("error:"+evt.data);
  }
</script>

</body>
</html>

预览



30秒后

以上是关于Swoole—WebSocket—Task任务使用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用hhxsv5/laravel-s的异步任务队列

如何使用hhxsv5/laravel-s的异步任务队列

Swoole 的异步 Task 任务详解

swoole学习--登录模块

Swoft源码之Swoole和Swoft的分析

PHP+swoole实现聊天群发功能