Swoole实现异步投递task任务案例详解
发布:smiling 来源: PHP粉丝网 添加日期:2021-11-14 20:33:30 浏览: 评论:0
这篇文章主要介绍了Swoole实现异步投递task任务案例,结合实例形式详细分析了Swoole异步投递task任务的原理、实现方法及操作注意事项,需要的朋友可以参考下。
本文实例讲述了Swoole实现异步投递task任务案例。分享给大家供大家参考,具体如下:
【使用场景】
Swolle的task模块可以用来做一些异步的慢速任务、耗时场景。如webim中发广播,发送邮件等,把这些任务丢给task进程之后,worker进程可以继续处理新的数据请求,任务完成后会异步通知worker进程告诉它此任务已经完成。此外利用task还可以实现PHP的数据库连接池,异步队列等。
【使用须知】
必须设置Task进程数: task_worker_num
投递一个异步任务到task_worker池中:Server->task
必须注册onTask、onFinish2个事件回调函数。
【示例】
以创建一个WebSocket服务异步投递任务为例:
ws_server.php:
- <?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监听:
- <!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服务:
php ws_server.php
前后刷新了两次页面,WebSocket服务器监听结果:
(服务器会先返回消息给客户端,然后再执行投递任务)
Tags: Swoole php异步投递 task
相关文章
- ·php异步多线程swoole使用实例程序(2015-04-15)
- ·PHP程序员学习使用Swoole的理由(2018-09-14)
- ·swoole_process父子进程管道通信的代码示例(2020-01-16)
- ·swoole事件处理流程(2020-04-06)
- ·Swoole协程与传统fpm同步模式比较(2020-04-09)
- ·PHP框架Swoole定时器Timer特性分析(2021-04-05)
- ·php异步多线程swoole用法实例(2021-04-26)
- ·使用php+swoole对client数据实时更新(一)(2021-07-04)
- ·PHP+swoole实现简单多人在线聊天群发(2021-07-06)
- ·基于 Swoole 的微信扫码登录功能实现代码(2021-08-30)
- ·基于swoole实现多人聊天室(2021-10-01)
- ·swoole_process实现进程池的方法示例(2021-11-01)
- ·PHP扩展Swoole实现实时异步任务队列示例(2021-11-17)
- ·PHP+swoole+linux实现系统监控和性能优化操作示例(2021-11-17)
- ·Swoole4.4协程抢占式调度器详解(2021-11-23)
- ·PHP下用Swoole实现Actor并发模型的方法(2021-11-25)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)