topthink/think-swoole 扩展包的使用 之 Task
本想自己适配的,奈何keng貌似不少,所以果断选择官方提供的包来适配233。。。
默认条件:thinkphp5.1.*版本下,且安装了swoole扩展
主要演示:task 任务的投递
友情提示:在swoole启动框架时,需注意静态变量的使用,会常驻内存(比如单例的变量),... 无图言卵,我么的口号是有图有真相(搞事)
以下是swoole下单例模式发送邮件:


请看收件人, 图一给 994xxx@qq.com发送邮件; 图二给 159xxx@qq.com 发送邮件,其收件人却有两(包含图一中的账号)。
一、安装
composer require topthink/think-swoole=2.0.*
二、使用
如果你要运行 swoole 的 http 服务器来启动 thinkPHP框架,执行
php think swoole
默认启动完成后,会在0.0.0.0:9501启动一个HTTP Server,可以直接访问当前的应用。
swoole的参数可以在应用配置目录下的 swoole.php 里面配置,配置详情见 thinkPHP官网
扩展中定义了 onWorkerStart和 onRequest事件回调方法(如果不熟悉请不要随意替换),如果你需要自定义swoole的事件回调方法,可以在配置文件中使用闭包定义。
以下是我的配置(自定义了task任务回调):
use app\common\lib\utils\Task;
use think\facade\Env;
use think\facade\Log; // +----------------------------------------------------------------------
// | Swoole设置 php think swoole命令行下有效
// +----------------------------------------------------------------------
return [
// 扩展自身配置
'host' => '0.0.0.0', // 监听地址
'port' => 9501, // 监听端口
'mode' => '', // 运行模式 默认为SWOOLE_PROCESS
'sock_type' => '', // sock type 默认为SWOOLE_SOCK_TCP
'server_type' => 'http', // 服务类型 支持 http websocket
'app_path' => '', // 应用地址 如果开启了 'daemonize'=>true 必须设置(使用绝对路径)
'file_monitor' => false, // 是否开启PHP文件更改监控(调试模式下自动开启)
'file_monitor_interval' => 2, // 文件变化监控检测时间间隔(秒)
'file_monitor_path' => [], // 文件监控目录 默认监控application和config目录 // 可以支持swoole的所有配置参数
'pid_file' => Env::get('runtime_path') . 'swoole.pid',
'log_file' => Env::get('runtime_path') . 'swoole.log',
'document_root' => Env::get('root_path') . 'public',
'enable_static_handler' => true,
'timer' => true,//是否开启系统定时器
'interval' => 500,//系统定时器 时间间隔
'task_worker_num' => 1,//swoole 任务工作进程数量 /**
* 自定义投递任务
* @param swoole_server $serv
* @param int $taskId
* @param int $srcWorkerId
* @param mixed $data
*/
'Task' => function($serv, $taskId, $srcWorkerId, $data){
$taskObj = new Task();
$classMethods = get_class_methods(Task::class);
if (!in_array($data['method'], $classMethods)) {
return 'method:'.$data['method'].' not find in'.Task::class;
}
return call_user_func_array([$taskObj, $data['method']], $data['params']);
},
/**
* onTask事件中没有调用finish方法或者return结果,worker进程不会触发onFinish
* @Param swoole_server $serv
* @param int $taskId 任务的ID
* @param string $data 任务处理的结果内容
*/
'Finish' => function ($serv, $taskId, $data) {
// echo 'taskId:' . $taskId . PHP_EOL;
echo 'Finished:' . $data;
Log::record($data);
}
];
实现任务的投递两种方法实现
Index控制器中:
<?php namespace app\index\controller; use app\common\lib\task\SmsTask;
use app\common\lib\utils\Tool;use think\Controller;
use think\Request; class Index extends Controller
{
public function sendSms(Request $request)
{
$result = $this->validate($request->post(), ['mobile' => 'require|mobile']);
if (true !== $result) {
return Tool::json('', $result, 250);
}
$mobile = $request->post('mobile'); // 1、使用topthink/swoole自带的任务投递方式,传递参数必须是对象或者swoole回调函数
// $smsObj = new SmsTask($mobile);
// app('swoole')->task($smsObj);
// app('swoole')->task($smsObj); // 2、自定义任务投递方式
app('swoole')->task(Tool::taskParam('sendSms', (array)$mobile)); return Tool::json('', '短信发送成功');
}
SmsTask.php
使用系统默认的回调模板,
且投递的参数必须是对象或者swoole回调函数,
投递任务后默认会执行 run()方法或者swoole回调函数
<?php namespace app\common\lib\task; use Fairy\SmsSender;
use think\facade\Config;
use think\swoole\template\Task; /**
* 使用 topthink/swoole 自带的Task任务
* Class SmsTask
* @package app\common\lib\task
*/
class SmsTask extends Task
{
private $mobile; public function initialize($args)
{
// TODO: Implement initialize() method.
$this->mobile = $args[0];
} public function run($serv, $taskId, $fromWorkerId)
{
// TODO: Implement run() method.
$smsObj = SmsSender::getInstance(Config::get('mail.'));
$bool = $smsObj->send($this->mobile);
if ($bool) {
return 'send sms to ' . $this->mobile . ' success';
} else {
return $smsObj->getError();
}
}
}
Task.php
配合swoole.php中自定义的 task 回调函数使用
<?php namespace app\common\lib\utils; use Fairy\SmsSender;use think\facade\Config; /**
* 异步任务类
* Class Task
* @package app\common\lib\utils
*/
class Task
{
/**
* 异步发送短信
* @param $mobile
* @return mixed|string
* @throws \ErrorException
*/
public function sendSms($mobile)
{
$smsObj = SmsSender::getInstance(Config::get('sms.'));
$bool = $smsObj->send($mobile);
if ($bool) {
return 'send sms to ' . $mobile . ' success';
} else {
return 'send sms to ' . $mobile . ' failed: ' . $smsObj->getError();
}
}
}
异步发送短信执行流程(拿自定义的task来举例):
- 配置swoole.php的自定义task函数
- 访问控制器 index/index/index 下的 sendSms() 方法 会投递一个任务,传递一些参数给task,此时接口数据已返回且短信发送任务也已投递
- task回调,也就是执行 swoole.php 中的配置的 task 函数
- 执行 finish 回调
- 打完收工,你学会了吗
参考:
https://www.kancloud.cn/manual/thinkphp5_1/675277
https://github.com/top-think/think-swoole/tree/v2.0.17
https://www.imooc.com/article/31751
topthink/think-swoole 扩展包的使用 之 Task的更多相关文章
- Ubuntu 16.04 swoole扩展安装注意!!!
前言:目前很多项目估计常常会用到swoole扩展,如个人使用Ubuntu虚拟机安装扩展,这里总结一下遇到的问题: 一.先保证服务器时间同步当前地区时间,如北京时间: 1.设定时区 如:设定时区:dpk ...
- 【原】用PHP搭建基于swoole扩展的socket服务(附PHP扩展的安装步骤及Linux/shell在线手册)
最近公司的一项目中,需要用PHP搭建一个socket服务. 本来PHP是不适合做服务的,因为和第三方合作,需要采用高效而稳定的TCP协议进行数据通信.经过多次尝试,最终选择了开源的PHP扩展:swoo ...
- Windows下用Composer引入官方GitHub扩展包
Windows下用Composer引入官方GitHub扩展包 1. 当你打开威武RC4版本的链接的时候,往下拉你可以看到这个,然后你要做的就是想到,百度Composer,看看是个什么鬼,别想太多,跟着 ...
- Windows下swoole扩展的编译安装部署
1. 到cygwin官网下载cygwin. 官网地址:https://www.cygwin.com/ 2. 打开下载好的cygwin安装包,开始安装cygwin. 选择cygwin的安装目录(这个同时 ...
- linux下搭建lamp环境以及安装swoole扩展
linux下搭建lamp环境以及安装swoole扩展 一.CentOS 6.5使用yum快速搭建LAMP环境 准备工作:先更新一下yum源 我安装的环境是:apache2.2.15+mysql5 ...
- Mac系统下 PHP7安装Swoole扩展 教程
转载自 https://www.fujieace.com/php/php-extensions/swoole.html 今天我用的PHP版本是:PHP7.1 环境依赖: php-5.3.10 或更高版 ...
- thinkphp5 Windows下用Composer引入官方GitHub扩展包
很多新手,比如说我,写代码就是在windows下,所以总会遇到很多不方便的地方,比如说GitHub上面的代码更新了,要是你在linux,只要几行命令就可以搞定更新了,在windows下面,你需要用到C ...
- php swoole扩展安装
一波三折. 首先下载swoole安装包(由于我这里php是7,所以说应该去官网下载最新的swoole包,否则会发生意想不到的错误) wget https://github.com/swoole/swo ...
- 转 linux安装swoole扩展
linux安装swoole扩展 发表于2年前(2014-09-03 14:05) 阅读(4404) | 评论(3) 7人收藏此文章, 我要收藏 赞2 上海源创会5月15日与你相约[玫瑰里],赶快来 ...
随机推荐
- numpy.bincount正确理解
今天看了个方法,numpy.bincount首先官网文档: numpy.bincount numpy.bincount(x, weights=None, minlength=0) Count numb ...
- composer基本命令
安装:https://getcomposer.org/download/ { "require":{ // "厂商/类库":"版本号", & ...
- 【代码审计】PHPCMS2008任意代码执行漏洞
很老的漏洞了,但很经典~ 在 phpcms2008/include/global.func.php eval 可以执行命令 在这里我们看一下是谁调用 跟进string2array函数 yp/web/ ...
- java.io包中的四个抽象类
IO所谓的四大抽象类就是: InputStream.OutputStream.Reader.Writer
- 吴裕雄--天生自然TensorFlow2教程:损失函数及其梯度
import tensorflow as tf x = tf.random.normal([2, 4]) w = tf.random.normal([4, 3]) b = tf.zeros([3]) ...
- JAVA面向对象解决实际问题实例(一)
某次战役中,为便于信息交互,我军侦察部门将此次战役的关键高地坐标设定为(x=0,y=0)并规定,每向东增加100米,x加1,每向北增加100米,y加1.同时,我军情报部门也破译了敌军向坦克发送的指挥信 ...
- java面试(一)
一.java基础 1.JDK和JRE的区别? JDK是java的开发环境,JRE是java的运行环境,即编写java程序就一定需要JDK,只是运行java程序只要JRE就足够了. 2.java中==和 ...
- LeetCode简单题(四)
题目一: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你 ...
- Jmeter 如何发起一个Get请求
举例平台:https://www.juhe.cn/docs/api/id/65 前提条件: 1)要在聚合网站注册实名认证才可以收到Key,用于Get请求的参数数值 2)Jmeter本地安装好 3.这是 ...
- WebRTC之Android客户端
一.WebRTC的Android客户端搭建 1.libjingle_peerconnection_so.so 2.libjingle_peerconnection.jar 3.客户端源码一份(可以在g ...