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 文件上传全攻略
Apr 28 PHP
PHP 面向对象 PHP5 中的常量
May 05 PHP
php explode函数实例代码
Feb 27 PHP
PHP面向对象程序设计之接口用法
Aug 20 PHP
php数组去除空值函数分享
Feb 02 PHP
PHP+MySQL存储数据常见中文乱码问题小结
Jun 13 PHP
替换php字符串中的单引号为双引号的方法
Feb 16 PHP
详解PHP处理字符串类似indexof的方法函数
Jun 11 PHP
PHP注释语法规范与命名规范详解篇
Jan 21 PHP
PHP重置数组为连续数字索引的几种方式总结
Mar 12 PHP
PHP如何搭建百度Ueditor富文本编辑器
Sep 21 PHP
laravel 中某一字段自增、自减的例子
Oct 11 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
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
PHP中操作ini配置文件的方法
2013/04/25 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
对联广告js flash激活
2006/10/19 Javascript
js 解决“options为空或不是对象”
2008/12/22 Javascript
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
2011/01/12 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
2012/11/24 Javascript
基于javascript滚动图片具体实现
2013/11/18 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
影响jQuery使用的14个方面
2014/09/01 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
2015/05/25 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
2018/06/05 jQuery
Ubuntu安装Jupyter Notebook教程
2017/10/18 Python
pandas数值计算与排序方法
2018/04/12 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
python批量修改xml属性的实现方式
2020/03/05 Python
毕业生的自我鉴定
2013/10/29 职场文书
小学英语教学反思
2014/01/30 职场文书
《胡杨》教学反思
2014/02/16 职场文书
保安岗位职责
2014/02/21 职场文书
党员批评与自我批评材料
2014/10/14 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书
MySQL Shell的介绍以及安装
2021/04/24 MySQL
解读MySQL的客户端和服务端协议
2021/05/10 MySQL
Win10此设备不支持接收Miracast无法投影的解决方法
2022/07/07 数码科技