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日与你相约[玫瑰里],赶快来 ...
随机推荐
- 点击<a href="#">阻止自动跳转到顶部方法
最近开发web项目,遇到一个问题 ,就是在<a>标签加href="#",并增加onclick事件,页面会自动在点击该标签绑定的元素时,自动跳转到页面顶部,在网上寻求了一 ...
- acm数论之旅(转载)---最大公约数与最小公倍数
gcd(a, b),就是求a和b的最大公约数 lcm(a, b),就是求a和b的最小公倍数 然后有个公式 a*b = gcd * lcm ( gcd就是gcd(a, b), ( •̀∀•́ ) ...
- DVWA实验之Brute Force(暴力破解)- Medium
DVWA实验之Brute Force(暴力破解)- Medium 有关DVWA环境搭建的教程请参考: https://www.cnblogs.com/0yst3r-2046/p/10928380. ...
- Django rest framework框架中有哪些组件
认证 权限(授权) 用户访问次数/频率限制 版本 解析器(parser) 序列化 分页 路由系统 视图 渲染器 认证 自定义认证的类 """ from rest_fram ...
- K8S的安装
两种方式安装k8s: 传统方式,使用二进制. 优点:能够让我们更清楚k8s的组件关系,可扩展性强,可定制化 缺点:不利于新手部署 使用kubeadm安装 优点:简单,高效 缺点:所有的事情都被kude ...
- BUG搬运工:CSCvp31778-3802 apsw_watchdog: WARNING: System memory is running low
如下bug主要针对Cisco COS AP比如18.28.38... 主要现象: AP上连关联的终端显示的是信号满格,但是无法访问内网,所有的终端都这样,只有重启AP后才可以解决. 频率: 这种现象有 ...
- UI UED设计
Element: https://element.eleme.cn/#/zh-CN/guide/design
- ArrayStack(栈)
顺序栈即数组型的栈.什么是栈呢?简单来说就像一个刚好装的下乒乓球大小的球筒,假设不能暴力打开球筒且只有一端有出口,那你放入或取出里面的球的操作都只能在一端进行,并且把球放进去或取出来都是由顺序决定的, ...
- win10 安装"pip install orange3" 出现LINK : fatal error LNK1158: cannot run 'rc.exe' 错误的解决办法
解决办法: 从(本例使用的是64位的python3.6 注意:如果python的版本是32位,则使用x86:如果是64位,则使用x64;) 复制一下两个文件 rc.exe rcdll.dll 到
- ip命令规范
从centos7以前我们一直使用ifconfig命令来执行网络相关的任务,比如检查和配置网卡信息,但是ifconfig已经不再被维护,并且在最近版本的Linux中被废除了!ifconfig命令已经被i ...