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 相关文章推荐
优化使用mysql存储session的php代码
Jan 10 PHP
一些被忽视的PHP函数(简单整理)
Apr 30 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
Aug 14 PHP
joomla jce editor 解决上传中文名文件失败问题
Jun 09 PHP
深入解析php中的foreach函数
Aug 31 PHP
zf框架的registry(注册表)使用示例
Mar 13 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
Oct 22 PHP
PHP中error_log()函数的使用方法
Jan 20 PHP
php判断访问IP的方法
Jun 19 PHP
PHP检测用户是否关闭浏览器的方法
Feb 14 PHP
php成功操作redis cluster集群的实例教程
Jan 13 PHP
php7中停止php-fpm服务的方法详解
May 09 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
Zerg基本策略
2020/03/14 星际争霸
URL Rewrite的设置方法
2007/01/02 PHP
php 文件夹删除、php清除缓存程序
2009/08/25 PHP
php比较两个绝对时间的大小
2014/01/31 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
js中的string.format函数代码
2020/08/11 Javascript
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
2015/11/09 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
微信小程序 本地图片按照屏幕尺寸处理
2017/08/04 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
[02:07]DOTA2超级联赛专访BBC:难忘网吧超神经历
2013/06/09 DOTA
[02:53]DOTA2亚洲邀请赛 NewBee战队巡礼
2015/02/03 DOTA
python把1变成01的步骤总结
2019/02/27 Python
python中的数据结构比较
2019/05/13 Python
python 调试冷知识(小结)
2019/11/11 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
python对一个数向上取整的实例方法
2020/06/18 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
大学自我评价
2014/02/12 职场文书
工商管理专业毕业生自我鉴定2014
2014/10/04 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
DQL数据查询语句使用示例
2022/12/24 MySQL