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递归删除目录与文件的方法
Jan 30 PHP
php从文件夹随机读取文件的方法
Jun 01 PHP
PHP实现的json类实例
Jul 28 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
Oct 19 PHP
PHP+ajax分页实例简析
Dec 07 PHP
PHP数学运算与数据处理实例分析
Apr 01 PHP
php对接java现实加签验签的实例
Nov 25 PHP
Redis构建分布式锁
Mar 28 PHP
Yii2框架中日志的使用方法分析
May 22 PHP
PHP回调函数与匿名函数实例详解
Aug 16 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
php生成静态页面并实现预览功能
Jun 27 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常用函数小技巧
2008/09/11 PHP
php循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
openflashchart 2.0 简单案例php版
2012/05/21 PHP
laravel model 两表联查示例
2019/10/24 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
JavaScript 比较时间大小的代码
2010/04/24 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
JS常见问题整理(持续更新)
2013/08/06 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
Nodejs进程管理模块forever详解
2014/06/01 NodeJs
nodejs事件的监听与触发的理解分析
2015/02/12 NodeJs
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
java必学必会之static关键字
2015/12/03 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
微信小程序自定义导航隐藏和显示功能
2017/06/13 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
使用vue2实现购物车和地址选配功能
2018/03/29 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
通过实例学习React中事件节流防抖
2019/06/17 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
详解Python字符串对象的实现
2015/12/24 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
python 读取二进制 显示图片案例
2020/04/24 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
自我评价优秀范文分享
2013/11/30 职场文书
优秀党支部申报材料
2014/12/24 职场文书
父亲节活动总结
2015/02/12 职场文书
中学推普周活动总结
2015/05/07 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
Python 的演示平台支持 WSGI 接口的应用
2022/04/20 Python