本想自己适配的,奈何keng貌似不少,所以果断选择官方提供的包来适配233。。。

默认条件:thinkphp5.1.*版本下,且安装了swoole扩展

主要演示:task 任务的投递

友情提示:在swoole启动框架时,需注意静态变量的使用,会常驻内存(比如单例的变量),... 无图言卵,我么的口号是有图有真相(搞事)

以下是swoole下单例模式发送邮件:

请看收件人, 图一给 994xxx@qq.com发送邮件; 图二给 159xxx@qq.com 发送邮件,其收件人却有两(包含图一中的账号)。

找寻原因: 
由于使用的是单例模式邮件发送,其$phpmail对象只实例化一次 ,图一当添加收件人时 $shouJianRen[ ] = 994xxx@qq.com 结束;图二给 159xxx@qq.com 发送邮件,由于$phpmail对象不会再次实例化 也就是此时他的属性 $shouJianRen 已不再是空值,继而会继续叠加第二个收件人,所以也就造成了第二次给 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来举例):

  1. 配置swoole.php的自定义task函数
  2. 访问控制器 index/index/index 下的 sendSms() 方法 会投递一个任务,传递一些参数给task,此时接口数据已返回且短信发送任务也已投递
  3. task回调,也就是执行 swoole.php 中的配置的 task 函数
  4. 执行 finish 回调
  5. 打完收工,你学会了吗

参考:

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的更多相关文章

  1. Ubuntu 16.04 swoole扩展安装注意!!!

    前言:目前很多项目估计常常会用到swoole扩展,如个人使用Ubuntu虚拟机安装扩展,这里总结一下遇到的问题: 一.先保证服务器时间同步当前地区时间,如北京时间: 1.设定时区 如:设定时区:dpk ...

  2. 【原】用PHP搭建基于swoole扩展的socket服务(附PHP扩展的安装步骤及Linux/shell在线手册)

    最近公司的一项目中,需要用PHP搭建一个socket服务. 本来PHP是不适合做服务的,因为和第三方合作,需要采用高效而稳定的TCP协议进行数据通信.经过多次尝试,最终选择了开源的PHP扩展:swoo ...

  3. Windows下用Composer引入官方GitHub扩展包

    Windows下用Composer引入官方GitHub扩展包 1. 当你打开威武RC4版本的链接的时候,往下拉你可以看到这个,然后你要做的就是想到,百度Composer,看看是个什么鬼,别想太多,跟着 ...

  4. Windows下swoole扩展的编译安装部署

    1. 到cygwin官网下载cygwin. 官网地址:https://www.cygwin.com/ 2. 打开下载好的cygwin安装包,开始安装cygwin. 选择cygwin的安装目录(这个同时 ...

  5. linux下搭建lamp环境以及安装swoole扩展

    linux下搭建lamp环境以及安装swoole扩展   一.CentOS 6.5使用yum快速搭建LAMP环境 准备工作:先更新一下yum源  我安装的环境是:apache2.2.15+mysql5 ...

  6. Mac系统下 PHP7安装Swoole扩展 教程

    转载自 https://www.fujieace.com/php/php-extensions/swoole.html 今天我用的PHP版本是:PHP7.1 环境依赖: php-5.3.10 或更高版 ...

  7. thinkphp5 Windows下用Composer引入官方GitHub扩展包

    很多新手,比如说我,写代码就是在windows下,所以总会遇到很多不方便的地方,比如说GitHub上面的代码更新了,要是你在linux,只要几行命令就可以搞定更新了,在windows下面,你需要用到C ...

  8. php swoole扩展安装

    一波三折. 首先下载swoole安装包(由于我这里php是7,所以说应该去官网下载最新的swoole包,否则会发生意想不到的错误) wget https://github.com/swoole/swo ...

  9. 转 linux安装swoole扩展

    linux安装swoole扩展 发表于2年前(2014-09-03 14:05)   阅读(4404) | 评论(3) 7人收藏此文章, 我要收藏 赞2 上海源创会5月15日与你相约[玫瑰里],赶快来 ...

随机推荐

  1. Redis搭建一主一从及哨兵模式(二)

    废话不多说,直接进入正题. 一.主从搭建 进入redis的根目录,拷贝一份redis.conf,最初的一份留作模版: ①cp  redis.conf redis.conf.template ②vim ...

  2. php 单机redis 常用命令

    一.Redis连接与认证 //连接参数:ip.端口.连接超时时间,连接成功返回true,否则返回false $ret = $redis->connect('127.0.0.1', 6379, 3 ...

  3. UE4高级运动系统(Advanced Locomotion System V3)插件分析

    Advanced Locomotion System V3是虚幻商城的一款第三方插件.它相比UE4的基础走跑跳表现,实现了更多动作游戏里常用的运动特性,虽然价格定价不菲,依然备受关注.笔者试用了这款插 ...

  4. uniGUI之UniPopupMenu和右键菜单(27)

    0]MainModule的BrowserOptions.boDisableMouseRightClick设置为Trure; 1]控件的OnCellContextClick的事件 procedure T ...

  5. python学习笔记:分支 与 循环

    if 语句 if 条件: ...... # 条件为真的时候,执行缩进的代码 if 条件: ...... # 条件为真的时候执行 else: ...... # 条件为假的时候执行 if 条件1: ... ...

  6. POJ1321棋盘问题(暴搜)

    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. ...

  7. 洛谷P1060开心的金明(滚动数组优化)

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NNN元钱就行”. ...

  8. pytoch 安装

    注意替换清华源,否则直接安装速度会很慢. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud ...

  9. MySQL高可用之MHA配置

    本文简单介绍了MySQL的高可用实现方式之一的MHA MHA:Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点:通过提升某一从节点为新的主节点,基于主 ...

  10. 大道至简第一章JAVA伪代码形式读后感

    //愚公移山: public class YuGongYiShan{ //原始需求:“惩山北之塞,出入之迂” //沟通方式:“聚室而谋曰” //项目目标:“毕力平险,指通豫南,达于汉阴” //技术方案 ...