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


Posted in PHP onApril 02, 2019

本文实例讲述了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服务器监听结果:

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

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

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

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

PHP 相关文章推荐
PHP 数组入门教程小结
May 20 PHP
PHP数组传递是值传递而非引用传递概念纠正
Jan 31 PHP
深入php-fpm的两种进程管理模式详解
Jun 03 PHP
强烈声明: 不要使用(include/require)_once
Jun 06 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
Apr 25 PHP
php比较两个字符串长度的方法
Jul 13 PHP
php创建桌面快捷方式实现方法
Dec 31 PHP
PHP精确计算功能示例
Nov 29 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
Feb 17 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
Jan 16 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
Apr 02 #PHP
Linux下源码包安装Swoole及基本使用操作图文详解
Apr 02 #PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
Apr 02 #PHP
phpStorm+XDebug+chrome 配置详解
Apr 01 #PHP
PHP+Oracle本地开发环境搭建方法详解
Apr 01 #PHP
phpstorm 配置xdebug的示例代码
Mar 31 #PHP
PHP文件后缀不强制为.php方法
Mar 31 #PHP
You might like
php网页病毒清除类
2014/12/08 PHP
php车辆违章查询数据示例
2016/10/14 PHP
一个实用的php验证码类
2017/07/06 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
Bootstrap 填充Json数据的实例代码
2017/01/11 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
小程序多图列表实现性能优化的方法步骤
2019/05/28 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
python使用mailbox打印电子邮件的方法
2015/04/30 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
python实现12306火车票查询器
2017/04/20 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
python检测IP地址变化并触发事件
2018/12/26 Python
Puppeteer使用示例详解
2019/06/20 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
UNIX文件系统分类
2014/11/11 面试题
法律专业应届本科毕业生求职信
2013/10/25 职场文书
旅游节目策划方案
2014/05/26 职场文书
婚庆公司计划书
2014/09/15 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
分享MySQL常用 内核 Debug 几种常见方法
2022/03/17 MySQL
设置IIS Express并发数
2022/07/07 Servers