Swoole实现异步投递task任务案例详解

2025-05-29 0 90

本文实例讲述了swoole实现异步投递task任务案例。分享给大家供大家参考,具体如下:

【使用场景】

swolle的task模块可以用来做一些异步的慢速任务、耗时场景。如webim中发广播,发送邮件等,把这些任务丢给task进程之后,worker进程可以继续处理新的数据请求,任务完成后会异步通知worker进程告诉它此任务已经完成。此外利用task还可以实现php的数据库连接池,异步队列等。

【使用须知】

必须设置task进程数:

投递一个异步任务到task_worker池中:server->task

必须注册ontask、onfinish2个事件回调函数。

【示例】

以创建一个websocket服务异步投递任务为例:

ws_server.php:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59
<?php

class ws {

public $ws = null;

public function __construct() {

$this->ws = new swoole_websocket_server("0.0.0.0", 9501);

$this->ws->set([

'worker_num' => 2, //worker进程数

'task_worker_num' => 2, //task进程数

]);

$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();

}

//建立连接回调

public function onopen($ws, $request) {

echo "{$request->fd}建立了连接";

}

//接受消息回调

public function onmessage($ws, $frame) {

//worker进程异步投递任务到task_worker进程中

$data = [

'fd' => $frame->fd,

];

$ws->task($data);

//服务器返回

echo "服务器发送消息:666";

}

//完成异步任务回调

public function ontask($serv, $task_id, $worker_id, $data) {

var_dump($data);

//模拟慢速任务

sleep(5);

//返回字符串给worker进程——>触发onfinish

return "success";

}

//完成任务投递回调

public function onfinish($serv, $task_id, $data) {

//task_worker进程将任务处理结果发送给worker进程

echo "完成任务{$task_id}投递 处理结果:{$data}";

}

//关闭连接回调

public function onclose($ws, $fd) {

echo "{$fd}关闭了连接";

}

}

$obj = new ws();

前端页面js监听:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>websocket</title>

</head>

<body>

</body>

<script type="text/javascript">

var websocket = new websocket('ws://127.0.0.1:9501');

websocket.onopen = function (evt) { onopen(evt) };

websocket.onclose = function (evt) { onclose(evt) };

websocket.onmessage = function (evt) { onmessage(evt) };

websocket.onerror = function (evt) { onerror(evt) };

function onopen(evt) {

console.log("connected to websocket server.");

//*发送消息到websocket服务器

websocket.send('666');

}

function onclose(evt) {

console.log("disconnected");

}

function onmessage(evt) {

console.log('retrieved data from server: ' + evt.data);

}

function onerror(evt) {

console.log('error occured: ' + evt.data);

}

</script>

</html>

开启websocket服务:

?

1
php ws_server.php

前后刷新了两次页面,websocket服务器监听结果:

Swoole实现异步投递task任务案例详解

Swoole实现异步投递task任务案例详解

(服务器会先返回消息给客户端,然后再执行投递任务)

希望本文所述对大家php程序设计有所帮助。

原文链接:https://blog.csdn.net/msllws/article/details/84782809

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Swoole实现异步投递task任务案例详解 https://www.kuaiidc.com/93132.html

相关文章

发表评论
暂无评论