Swoole Task任务使用
Swoole 异步Task,主要实现调用异步任务的执行。
常用的场景:异步支付处理、异步订单处理、异步日志处理、异步发送邮件/短信等。
Swoole 的实现方式是 worker 进程处理数据请求,分配给 task 进程执行。
官方介绍:
task 底层使用Unix Socket管道通信,是全内存的,没有IO消耗。单进程读写性能可达100万/s,不同的进程使用不同的管道通信,可以最大化利用多核。
本地版本:PHP 7.2.6、Swoole 4.3.1。
不多说,先看效果图:
代码
server.php
class Server{private $serv;public function __construct() {$this->serv = new swoole_server('0.0.0.0', 9501);$this->serv->set(['worker_num' => 2, //开启2个worker进程'max_request' => 4, //每个worker进程 max_request设置为4次'task_worker_num' => 4, //开启4个task进程'dispatch_mode' => 2, //数据包分发策略 - 固定模式]);$this->serv->on('Start', [$this, 'onStart']);$this->serv->on('Connect', [$this, 'onConnect']);$this->serv->on("Receive", [$this, 'onReceive']);$this->serv->on("Close", [$this, 'onClose']);$this->serv->on("Task", [$this, 'onTask']);$this->serv->on("Finish", [$this, 'onFinish']);$this->serv->start();}public function onStart($serv) {echo "#### onStart ####".PHP_EOL;echo "SWOOLE ".SWOOLE_VERSION . " 服务已启动".PHP_EOL;echo "master_pid: {$serv->master_pid}".PHP_EOL;echo "manager_pid: {$serv->manager_pid}".PHP_EOL;echo "########".PHP_EOL.PHP_EOL;}public function onConnect($serv, $fd) {echo "#### onConnect ####".PHP_EOL;echo "客户端:".$fd." 已连接".PHP_EOL;echo "########".PHP_EOL.PHP_EOL;}public function onReceive($serv, $fd, $from_id, $data) {echo "#### onReceive ####".PHP_EOL;echo "worker_pid: {$serv->worker_pid}".PHP_EOL;echo "客户端:{$fd} 发来的Email:{$data}".PHP_EOL;$param = ['fd' => $fd,'email' => $data];$rs = $serv->task(json_encode($param));if ($rs === false) {echo "任务分配失败 Task ".$rs.PHP_EOL;} else {echo "任务分配成功 Task ".$rs.PHP_EOL;}echo "########".PHP_EOL.PHP_EOL;}public function onTask($serv, $task_id, $from_id, $data) {echo "#### onTask ####".PHP_EOL;echo "#{$serv->worker_id} onTask: [PID={$serv->worker_pid}]: task_id={$task_id}".PHP_EOL;//业务代码for($i = 1 ; $i <= 5 ; $i ++ ) {sleep(2);echo "Task {$task_id} 已完成了 {$i}/5 的任务".PHP_EOL;}$data_arr = json_decode($data, true);$serv->send($data_arr['fd'] , 'Email:'.$data_arr['email'].',发送成功');$serv->finish($data);echo "########".PHP_EOL.PHP_EOL;}public function onFinish($serv,$task_id, $data) {echo "#### onFinish ####".PHP_EOL;echo "Task {$task_id} 已完成".PHP_EOL;echo "########".PHP_EOL.PHP_EOL;}public function onClose($serv, $fd) {echo "Client Close.".PHP_EOL;}}$server = new Server();
client.php
<?phpclass Client{private $client;public function __construct() {$this->client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);$this->client->on('Connect', [$this, 'onConnect']);$this->client->on('Receive', [$this, 'onReceive']);$this->client->on('Close', [$this, 'onClose']);$this->client->on('Error', [$this, 'onError']);}public function connect() {if(!$fp = $this->client->connect("127.0.0.1", 9501 , 1)) {echo "Error: {$fp->errMsg}[{$fp->errCode}]".PHP_EOL;return;}}public function onConnect($cli) {fwrite(STDOUT, "输入Email:");swoole_event_add(STDIN, function() {fwrite(STDOUT, "输入Email:");$msg = trim(fgets(STDIN));$this->send($msg);});}public function onReceive($cli, $data) {echo PHP_EOL."Received: ".$data.PHP_EOL;}public function send($data) {$this->client->send($data);}public function onClose($cli) {echo "Client close connection".PHP_EOL;}public function onError() {}}$client = new Client();$client->connect();
Swoole Task任务使用相关推荐
- swoole task MySQL连接池
参考 https://blog.csdn.net/ldy3243942/article/details/40596547 上一章中我简单讲解了如何开启和使用Task功能.这一节,我将提供一个Task的 ...
- swoole task 异步任务 注释请忽略 自己加的不一定对 别误导大家。。。。。。
注释可以忽略不计 个人加的 可能会有错误 别误导大家... server端 <?php class Server {private $serv;public function __constru ...
- php定时任务sw,[原创]Swoole和Swoft的那些事(Task投递/定时任务篇)
Swoft的任务功能基于Swoole的Task机制,或者说Swoft的Task机制本质就是对SwooleTask机制的封装和加强. 任务投递 //Swoft\Task\Task.php class T ...
- php 游戏开发swoole,《基于 Swoole 的对战游戏实践》开课啦
项目由来 在三月份的时候就开始编写这个项目,原本只是觉得自己对 Swoole 不太熟练,当作练手来写着玩的.写着写着发现还挺好玩的,代码量也不多,捉迷藏游戏的趣味性不错. 如果只写完代码就扔在 Git ...
- Swoole基础知识,安装,websocket应用及各种问题详解
1. swoole基础-概述 Swoole基础课程正式推出!零基础开始,让你循环渐进的掌握swoole. 传统的phper们大部分都是用于开发web应用程序,并且大部分都是在用类似yii\larave ...
- swoft php怎么样,Swoft源码之Swoole和Swoft的分析
这篇文章给大家分享的内容是关于Swoft 源码剖析之Swoole和Swoft的一些介绍(Task投递/定时任务篇),有一定的参考价值,有需要的朋友可以参考一下. 前言 Swoft的任务功能基于Swoo ...
- mysql异步task_EasySwoole高性能task异步任务
EasySwoole高性能task异步任务 羡仙. • 2019 年 06 月 20 日 和上一篇一样也是遗漏的重要文章,我太聪明了,这都能发现...他们都有共同的特征:笔记里的开头在上一篇...不管 ...
- Swoole结合Thinkphp发送10万+微信模板消息
使用Thinkphp5.0框架 服务端: <?php namespace app\Console;use think\console\Command; use think\console\Inp ...
- thinkphp使用 think-swoole task
是参考这位大佬的,大家可以去看看https://www.kancloud.cn/book_xwy/think-swoole3/1720752 安装thinkphp6 composer create-p ...
最新文章
- 使用logrotate管理nginx日志文件
- codeforce 154C - Double Profiles(hash)
- socket使用多进程实现并发的服务器
- QQProtect.exe(Q盾)
- java 多态实现的jvm调用过程_多态:JVM是如何进行方法调用的
- java的min函数_Java语言实现包含min函数的栈
- linux建立ftp suse_suse开通ftp的实例
- linux anaconda搜索路径,Anaconda安装及虚拟环境搭建教程(linux)
- Pannellum:实例之通过全景图游览
- 数值分析(7)-正交多项式
- Python语言的技术领域
- Java程序员如何写好一份个人求职简历
- msvcr71.dll文件丢失——解决办法
- 【安装Oracle 12.2.0.1补丁】Oracle Database SAP Bundle Patch 12.2.0.1.220118 - 202202
- 读书笔记:《人类简史:从动物到上帝》
- 关于华为应用市场审核App无法启动的问题
- 手把手教你在好友不知道的情况下,检查哪个微信好友删了你。
- 如果自己的微信被对方删除,微信会有哪些提示?
- STC89C52RC - 2 - 开发环境搭建
- 数据挖掘—逻辑回归分类—信用卡欺诈分析