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里的中文变量说明
Jul 23 PHP
解析关于wamp启动是80端口被占用的问题
Jun 21 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 PHP
Chrome Web App开发小结
Sep 04 PHP
PHP实现自动识别Restful API的返回内容类型
Feb 07 PHP
修改WordPress中文章编辑器的样式的方法详解
Dec 15 PHP
php批量删除操作代码分享
Feb 26 PHP
php微信公众号开发之校园图书馆
Oct 20 PHP
php如何计算两坐标点之间的距离
Dec 29 PHP
php中钩子(hook)的原理与简单应用demo示例
Sep 03 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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
解决微信授权回调页面域名只能设置一个的问题
2016/12/11 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
jquery属性,遍历,HTML操作方法详解
2016/09/17 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
Angular.JS通过指令操作DOM的方法
2017/05/10 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
本地存储localStorage用法详解
2017/07/31 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
python redis 批量设置过期key过程解析
2019/11/26 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
详解python的super()的作用和原理
2020/10/29 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
HTML5中的autofocus(自动聚焦)属性介绍
2014/04/23 HTML / CSS
爱耳日宣传活动总结
2014/07/05 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
煤矿安全保证书
2015/02/27 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
幼儿园家长心得体会
2016/01/21 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python
Pytorch DataLoader shuffle验证方式
2021/06/02 Python