gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Swoole实现异步投递task任务案例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

本文实例讲述了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 。

最后此篇关于Swoole实现异步投递task任务案例详解的文章就讲到这里了,如果你想了解更多关于Swoole实现异步投递task任务案例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com