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录入页面中动态从数据库中提取数据的实现
Oct 09 PHP
比较全的PHP 会话(session 时间设定)使用入门代码
Jun 05 PHP
PHP人民币金额数字转中文大写的函数代码
Feb 27 PHP
深入php函数file_get_contents超时处理的方法详解
Jun 03 PHP
解析PHP工厂模式的好处
Jun 18 PHP
php生成curl命令行的方法
Dec 14 PHP
php简单实现多维数组排序的方法
Sep 30 PHP
如何使用PHP给图片加水印
Oct 12 PHP
Yii CDBCriteria常用方法实例小结
Jan 19 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
PHP实现的ID混淆算法类与用法示例
Aug 10 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
Oct 24 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
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
jquery css 设置table的奇偶行背景色示例
2014/06/03 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
Vue防止白屏添加首屏动画的实例
2019/10/31 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
Python中的is和id用法分析
2015/01/26 Python
讲解Python中fileno()方法的使用
2015/05/24 Python
python方向键控制上下左右代码
2018/01/20 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
python实现全盘扫描搜索功能的方法
2019/02/14 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
python高阶函数map()和reduce()实例解析
2020/03/16 Python
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
标准导师推荐信(医学类)
2013/10/28 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
利用python做表格数据处理
2021/04/13 Python
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python