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制作简单的内容采集器的代码
Nov 28 PHP
PHP 采集程序原理分析篇
Mar 05 PHP
PHP sprintf()函数用例解析
May 18 PHP
PHP程序级守护进程的实现与优化的使用概述
May 02 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
Jun 09 PHP
php弹出对话框实现重定向代码
Jan 23 PHP
PHP开发框架kohana3 自定义路由设置示例
Jul 14 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
Mar 25 PHP
php给图片加文字水印
Jul 31 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
Jan 08 PHP
php 数组元素快速去重
May 05 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
May 17 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
Discuz Uchome ajaxpost小技巧
2011/01/04 PHP
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
JS重要知识点小结
2011/11/06 Javascript
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
jquery获取多个checkbox的值异步提交给php
2015/07/07 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
jQuery ztree实现动态树形多选菜单
2016/08/12 Javascript
canvas 弹幕效果(实例分享)
2017/01/11 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
基于jquery实现五星好评
2017/11/18 jQuery
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
详解Python的Django框架中的模版继承
2015/07/16 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
PySide和PyQt加载ui文件的两种方法
2019/02/27 Python
python匿名函数用法实例分析
2019/08/03 Python
Python timeit模块的使用实践
2020/01/13 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
工程管理专业毕业生自荐信
2014/01/24 职场文书
西北政法大学自主招生自荐信
2014/01/29 职场文书
名人演讲稿范文
2014/09/16 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
村官2015年度工作总结
2015/10/14 职场文书
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python
使用Django框架创建项目
2022/06/10 Python