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日与你相约[玫瑰里],赶快来 ...
随机推荐
- python学习HTML之CSS(2)
1.边框的属性设置 PS:边框的高度和宽度可以采用百分比,但是高度方向的百分比基本无用,因为基数没定,参考没意义!! 2.内边距和外边距 3.在右下角添加一个“回顶部”的标签. <div> ...
- Tensorflow机器学习入门——常量、变量、placeholder和基本运算
一.这里列出了tensorflow的一些基本函数,比较全面:https://blog.csdn.net/M_Z_G_Y/article/details/80523834 二.这里是tensortflo ...
- 理解CART决策树
CART算法 原理 CART全称为Classification and Regression Tree. 回归树 相比ID3,CART遍历所有的特征和特征值,然后使用二元切分法划分数据子集,也就是每个 ...
- Java面向对象简单知识总结-考试用
类.对象.构造器 类定义了属性.方法,是抽象的,写在扩展名为java的文件中. 对象是类的实体,是具体的. 构造器:方法名与类名一致.没有返回类型,可以重载不能重写.在创建对象时调用.使用new调用实 ...
- 【快学Docker】快速创建容器,容器常用命令
前言 容器是Docker的三大核心概念之一.简单地说,容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面 ...
- PyQt5中Web操作与多线程定时器
1.装载外部网页页面'''用web浏览器控件QWebEngineView控件显示网页PyQt5和Web的交互技术 同时使用python和Web开发程序,混合开发 Python+JavaScript+H ...
- springmvc中整合mongodb副本集配置文件
配置文件jdbc.properties: mongo.hostport=192.168.100.100:28007,192.168.100.110:28008,192.168.100.120:2800 ...
- cssdiv设置高宽百分比不起作用的问题
div等元素设置宽高百分比都是基于包含他的块级对象的百分比高度,所以必须先设置包含它的块级对象高度与宽度,但是光设置body是不起作用的,必须同时设置html和body. 要使用百分比设置div宽 ...
- RPC远程服务调用
RPC远程服务调用: RPC 的全称是 Remote Procedure Call 是一种进程间通信方式. 它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编 ...
- Oracle字符集查询及修改
字符集包括以下四种: 1.oracle服务端字符集 select * from nls_database_parameters; 2.oracle服务器注册字符集 HKEY_LOCAL_MACHINE ...