Thinkphp5 + Swoole实现邮箱异步通知
在 ThinkPHP 中实现邮箱异步通知的常见做法是通过队列系统来处理异步任务,结合 Swoole 来处理异步发送邮件的请求。这样可以避免同步处理邮件发送导致的阻塞,提高响应速度。
以下是基于 ThinkPHP5 框架和 Swoole 的异步邮件通知实现步骤:
一、安装 Swoole
首先,你需要确保 Swoole 已经正确安装,可以通过 Composer 安装:
pecl install swoole
二、邮件发送配置
和 Redis 队列的方案一样,我们需要先配置邮件发送,还是使用 PHPMailer 或者其他的邮件库来发送邮件。
在项目的 config.php 中配置邮件相关信息:
return ['email' => ['host' => 'smtp.example.com','username' => 'your-email@example.com','password' => 'your-password','port' => 465,'from' => 'your-email@example.com','from_name' => 'Your Name',],
];
三、创建邮件服务类
邮件服务类 MailService 负责处理邮件发送的逻辑。这里使用 PHPMailer 作为邮件发送工具。
application/common/service/MailService.php:
<?phpnamespace app\common\service;use PHPMailer\PHPMailer\PHPMailer;
use think\facade\Config;class MailService
{public static function sendMail($to, $subject, $body){$mail = new PHPMailer(true);try {$mail->isSMTP();$mail->Host = Config::get('email.host');$mail->SMTPAuth = true;$mail->Username = Config::get('email.username');$mail->Password = Config::get('email.password');$mail->SMTPSecure = 'ssl'; $mail->Port = Config::get('email.port');$mail->setFrom(Config::get('email.from'), Config::get('email.from_name'));$mail->addAddress($to);$mail->isHTML(true);$mail->Subject = $subject;$mail->Body = $body;$mail->send();return true;} catch (\Exception $e) {return $mail->ErrorInfo;}}
}
四、使用 Swoole 实现异步任务
1. 创建 Swoole Server
在项目的 command 目录下创建 SwooleServer.php,用于处理 Swoole 的服务和任务。
<?phpnamespace app\command;use Swoole\Server;
use app\common\service\MailService;
use think\console\Command;
use think\console\Input;
use think\console\Output;class SwooleServer extends Command
{protected function configure(){$this->setName('swoole:server')->setDescription('Start Swoole Server');}protected function execute(Input $input, Output $output){$server = new Server("127.0.0.1", 9501);// 设置 Swoole 的配置$server->set(['worker_num' => 4,'task_worker_num' => 4,]);// 当有客户端连接时触发$server->on('receive', function (Server $server, $fd, $reactor_id, $data) {// 处理客户端发送的任务数据$taskData = json_decode($data, true);if ($taskData && isset($taskData['to'], $taskData['subject'], $taskData['body'])) {// 投递任务给 Task Worker$server->task($taskData);}$server->send($fd, "Mail task received.");});// 处理异步任务$server->on('task', function (Server $server, $task_id, $from_worker_id, $data) {// 使用 MailService 发送邮件$result = MailService::sendMail($data['to'], $data['subject'], $data['body']);// 返回任务处理结果$server->finish($result);});// 任务处理完成时触发$server->on('finish', function (Server $server, $task_id, $data) {// 任务完成后的逻辑});$output->writeln('Swoole Server started.');// 启动 Swoole Server$server->start();}
}
2. 注册 Swoole 命令
在 application/command.php 中注册 SwooleServer 命令:
return ['app\command\SwooleServer',
];
3. 启动 Swoole Server
使用命令行启动 Swoole Server:
php think swoole:server
Swoole 服务器启动后,它将监听 127.0.0.1:9501,客户端可以通过这个端口向服务器发送任务请求。
五、在控制器中使用 Swoole 异步发送邮件
现在我们可以在控制器中通过向 Swoole Server 发送请求来处理异步邮件通知。
application/controller/UserController.php:
<?phpnamespace app\controller;use Swoole\Client;
use think\Controller;class UserController extends Controller
{public function register(){// 用户注册逻辑$email = 'user@example.com';$subject = '欢迎注册';$body = '感谢您注册我们的网站!';// 创建一个 Swoole 客户端$client = new Client(SWOOLE_SOCK_TCP);// 连接到 Swoole Serverif ($client->connect('127.0.0.1', 9501, 0.5)) {// 发送任务数据到 Swoole Server$client->send(json_encode(['to' => $email,'subject' => $subject,'body' => $body]));// 接收 Swoole Server 的反馈$response = $client->recv();$client->close();return json(['message' => $response]);} else {return json(['error' => 'Unable to connect to Swoole Server']);}}
}
六、总结
通过 Swoole 实现的异步任务处理机制,可以将耗时操作如发送邮件等操作放入后台异步执行,提升用户体验和系统性能。Swoole 的 Task 机制非常适合处理这种场景,结合 ThinkPHP 使得开发异步任务更加简单高效。
相关文章:
Thinkphp5 + Swoole实现邮箱异步通知
在 ThinkPHP 中实现邮箱异步通知的常见做法是通过队列系统来处理异步任务,结合 Swoole 来处理异步发送邮件的请求。这样可以避免同步处理邮件发送导致的阻塞,提高响应速度。 以下是基于 ThinkPHP5 框架和 Swoole 的异步邮件通知实现步骤: 一…...
LLM - 理解 多模态大语言模型 (MLLM) 的预训练与相关技术 (三)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/142063880 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 完备(F…...
工具篇之Joda-Time
在Java应用程序开发中,处理日期和时间是一项常见且复杂的任务。尽管Java标准库提供了基本的日期和时间操作类,但它们的使用常常不够直观和灵活。Joda-Time 是一个强大的日期和时间库,提供了丰富的API,用于简化日期和时间的操作。本…...
架构师应该懂得东西,软考应该具备的
架构师应该懂得知识 架构师作为软件系统设计和开发的关键角色,需要掌握广泛的知识和技能。具体来说,他们应该懂得以下几方面的知识: 编程语言:掌握至少一种编程语言,如Java、C、Python等,以便于进行系统设…...
图论篇--代码随想录算法训练营第五十一天打卡| 99. 岛屿数量(深搜版),99. 岛屿数量(广搜版),100. 岛屿的最大面积
99. 岛屿数量(深搜版) 题目链接:99. 岛屿数量 题目描述: 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而…...
什么是API网关(API Gateway)?
1. 什么是API网关(API Gateway)? 在微服务体系结构中,客户端可能与多个前端服务进行交互。 API 网关位于客户端与服务之间。 它充当反向代理,将来自客户端的请求路由到服务。 它还可以执行各种横切任务,例…...
对话:LLC磁集成能否成为充电桩模块电源常态产品?
编者按:在终端需求疲软的影响下,前两年火热的新能源汽车、光伏、储能等新能源领域也掀起了价格战,储能已正式进入0.5元时代,新能源汽车领域价格战更是一轮接一轮,成本管控成为2024年企业绕不开的话题。 接下来我们将围…...
基于SSM的二手物品交易管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的二手物品交易管理系统7拥有两种角色 管理员:用户管理、分类管理、商品管理、订单管理、系统管理等 用户:登录注册、充值、收货、评价、收藏、购物车、订…...
视觉语言模型中的人脸社会感知
本文研究了视觉语言模型CLIP在处理人脸图像时的社会感知能力及其潜在偏见。研究者们构建了一个名为CausalFace的合成人脸数据集,通过系统地独立变化年龄、性别、人种、面部表情、照明和姿势等六个维度来评估模型的社会感知。他们发现,尽管CLIP是在多样化…...
JAVA学习-练习试用Java实现“最小覆盖子串”
问题: 给定一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。 注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。 示例 1&…...
关于axios同步获取数据的问题
axios同步获取数据 Axios介绍问题代码修改 总结 Axios介绍 Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 X…...
java-在ANTLR中,如何从java文件中提取类名和方法名0.1.8
java-在ANTLR中,如何从java文件中提取类名和方法名0.1.0 目标java源文件java的g4文件生成antlr代码最终代码调测结果阶段性总结 2024年9月12日11:16:01----0.1.8 目标 从一个java文件中提取出类名和方法名 java源文件 文件名是main.java,具体内容如下…...
十大护眼灯钢琴灯品牌是智商税吗?十大钢琴灯品牌排行榜
十大护眼灯钢琴灯品牌是智商税吗?不良的光线不仅会使得孩子在读写用眼时眼睛不舒服,还会引起视觉疲劳伤眼视力健康,这个时候要能有一台可靠的护眼灯钢琴灯,那真是再好不过了。但是市面上护眼灯钢琴灯的种类太多,盲目挑…...
搜维尔科技:CyberGlove将实时捕捉运动信号和触觉反馈,将其重新定位到人形机器人进行驱动
CyberGlove将实时捕捉运动信号和触觉反馈,然后将其重新定位到人形机器人上。 这款18个传感器(有18节点和22节点两个型号,22节点早期用于美国军事方面,支持无线通信、蓝牙、WiFi、射频)数据手套的每个手指上有两个弯曲…...
数据结构:堆的算法
目录 一堆的向上调整算法二堆的向下调整算法三堆的应用:堆排序四TOPK问题 一堆的向上调整算法 我们在堆中插入一个数据一般实在堆的最后插入然后可以一步一步与上层结点(父结点进行比较),继而进行交换,完成二叉树的结构࿰…...
python画图|3D直方图基础教程
前述已经完成了直方图和3D图的基本学习,链接如下: 直方图:python画图|水平直方图绘制-CSDN博客 3D图:python画图|水平直方图绘制-CSDN博客 现在我们尝试把二者结合,画3D直方图。 【1】官网教程 首先,依…...
C语言中的函数,实参,形参,递归
1:什么是函数 2:定义带形式参数的函数和带实际参数的函数 3:递归 --------------------------------------------------------------------------------------------------------------------------------- 1:在 C 语言中&…...
ICM20948 DMP代码详解(15)
接前一篇文章:ICM20948 DMP代码详解(14) 上一回开始对icm20948_sensor_setup函数中第3段代码即inv_icm20948_initialize函数进行解析。为了便于理解和回顾,再次贴出其源码,在EMD-Core\sources\Invn\Devices\Drivers\IC…...
NC 和为K的连续子数组
系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 给定一个无序…...
JS设计模式之装饰者模式:优雅的给对象增添“魔法”
引言 在前端开发中,我们经常会遇到需要在不修改已有代码的基础上给对象添加新的行为或功能的情况。而传统的继承方式并不适合这种需求,因为继承会导致类的数量急剧增加,且每一个子类都会固定地实现一种特定的功能扩展。 装饰者模式则提供了…...
抠图软件在线使用有哪些?2026年最全对比测试,找到适合你的工具
最近被问得最多的问题就是:"有没有特别好用的抠图软件?"说实话,这两年AI技术的发展真的改变了抠图这件事儿。我自己也用过不少抠图工具,从专业的PS到各种在线应用,今天就来好好聊聊抠图软件在线使用有哪些选…...
iTop实战指南:3个关键挑战与ITSM平台架构优化策略
iTop实战指南:3个关键挑战与ITSM平台架构优化策略 【免费下载链接】iTop A simple, web based CMDB & IT Service Management tool 项目地址: https://gitcode.com/gh_mirrors/it/iTop 在数字化转型浪潮中,企业IT服务管理面临配置信息分散、…...
思源宋体TTF:免费专业中文字体终极使用指南
思源宋体TTF:免费专业中文字体终极使用指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文排版找不到合适的免费字体而烦恼吗?思源宋体TTF正是你需要…...
GaussDB GDS 搭建完全指南:从安装到启动,一文搞定数据迁移服务
在进行 GaussDB 跨库数据迁移时,GDS(Gauss Data Service) 是实现外表迁移的核心组件。本文将手把手带你完成 GDS 的下载、安装、配置与启动,确保数据迁移通道畅通无阻。 📎 关联阅读:GaussDB GDS 外表迁移实…...
RoboMaster新手必看:CAN通讯驱动GM6020电机,从ID配置到线序接法的保姆级避坑指南
RoboMaster新手必看:CAN通讯驱动GM6020电机,从ID配置到线序接法的保姆级避坑指南 第一次接触RoboMaster比赛的新手们,面对CAN总线驱动GM6020这类电调电机一体式设备时,常常会遇到"明明发送了CAN包但电机就是不转"的困扰…...
从平面到立体:用ImageToSTL将照片变为可触摸的3D模型
从平面到立体:用ImageToSTL将照片变为可触摸的3D模型 【免费下载链接】ImageToSTL This tool allows you to easily convert any image into a 3D print-ready STL model. The surface of the model will display the image when illuminated from the left side. …...
Unity VR开发选无线还是有线?Oculus Quest 2串流实战对比与效率工具推荐
Unity VR开发无线与有线串流深度对比:Oculus Quest 2高效开发全指南 当你沉浸在Unity VR开发的世界中,Oculus Quest 2无疑是目前最受欢迎的测试平台之一。但每次修改代码后漫长的打包安装过程,是否让你在无线自由与有线稳定之间反复纠结&…...
从 SAP Easy Access Menu 到 FLP 一体化入口:重新理解经典事务在 SAP Fiori 中的价值
在很多企业的数字化项目里,SAP Fiori 往往被理解为一套全新的体验层,而 SAP GUI 则被视为必须逐步替换掉的传统界面。这个判断只说对了一半。真正成熟的 Fiori 落地,不是把旧世界一刀切掉,而是让新旧能力在同一个入口里顺滑协作。SAP Easy Access Menu 的意义,恰恰就在这里…...
G-Helper深度解析:华硕笔记本的终极轻量级控制方案
G-Helper深度解析:华硕笔记本的终极轻量级控制方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Exper…...
RPG Maker MV Decrypter:解决游戏资源保护与合法访问的技术平衡方案
RPG Maker MV Decrypter:解决游戏资源保护与合法访问的技术平衡方案 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址: ht…...
