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+mysql保存和输出文件
Oct 09 PHP
php生成WAP页面
Oct 09 PHP
php url地址栏传中文乱码解决方法集合
Jun 25 PHP
一道求$b相对于$a的相对路径的php代码
Aug 08 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
Jun 19 PHP
php安装swoole扩展的方法
Mar 19 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 PHP
PHP实现链式操作的原理详解
Sep 16 PHP
thinkPHP中钩子的两种配置调用方法详解
Nov 11 PHP
PHP 年月日的三级联动实例代码
May 24 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
May 28 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查询域名状态whois的类
2006/11/25 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
php除数取整示例
2014/04/24 PHP
php实现的常见排序算法汇总
2014/09/08 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
2016/12/09 PHP
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
通过实例解析javascript Date对象属性及方法
2020/11/04 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
Python实现基本数据结构中队列的操作方法示例
2017/12/04 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
pandas 实现字典转换成DataFrame的方法
2018/07/04 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
python调用外部程序的实操步骤
2019/03/04 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
应用心理学个人求职信范文
2013/12/11 职场文书
迷你西餐厅创业计划书范文
2013/12/31 职场文书
护士节慰问信
2015/02/15 职场文书
党风廉政建设个人总结
2015/03/06 职场文书