摘要:使用教程用户注册场景异步发送邮件本地环境系统是版本版本最近看到这个扩展类但是手册没写很是头疼找了很多资料最后写了个场景写的不好大家见谅首先我们创建项目下载框架以及扩展创建项目进入项目目录查看下载扩展类下载完毕进入查看一下之后使用妈卖
think-queue使用教程-用户注册场景异步发送邮件
本地环境:
系统是:Mac Os
php版本:7.1
ThinkPHP版本:5.1.15
最近看到think-queue这个扩展类 但是手册没写,很是头疼,找了很多资料最后写了个场景,写的不好大家见谅
首先我们创建项目 下载tp框架以及think-queue扩展
创建项目:
进入项目目录查看:
下载扩展类
下载完毕进入查看一下:
之后使用MAMP(妈卖麻痹)创建虚拟机
之后创建数据库以及数据表;
create database if not exists myproject; use myproject; DROP TABLE IF EXISTS member; CREATE TABLE IF NOT EXISTS member( id int(11) AUTO_INCREMENT primary key comment "ID", email VARCHAR(32) NOT NULL DEFAULT "" COMMENT "", password VARCHAR(255) NOT NULL default "" comment "", create_time INT(11) UNSIGNED NOT NULL DEFAULT 0 comment "", update_time INT(11) UNSIGNED NOT NULL DEFAULT 0 comment "", unique key (email) )engine innodb charset utf8;
启动redis 服务
之后一些列的操作,比如开启强制路由,配置数据库,配置路由,配置模板标签等....
创建页面Register.php控制器 目录:application/index/controller/Register.php
创建Member.php 模型 目录:application/index/model/Member.php
创建Register.php 验证器 目录:application/index/validate/Register.php
创建处理队列的文件 sendActivationMail.php 目录:application/index/job/sendActivationMail.php
在Register控制器里面创建操作方法
model = new MemberModel(); } /** * 渲染模板 展示注册页面 * @return mixed */ public function index() { return $this->fetch("index"); } /** * 执行注册逻辑 */ public function doRegister() { if ($this->request->isPost()) { #实例化验证器 执行验证 如果验证失败跳转并且提示 $validate = new RegisterValidate(); $data = $this->request->post(); if (false === $validate->check($data)) return $this->error($validate->getError()); //此处应该加密密码 md5 sha1 hash 都可以 //写入注册的用户 $result = $this->model->allowField(["email", "password"])->save($data); if ($result) { //注册完毕后获取到邮件账号 然后加入到队列 $this->sendActivationMail($this->model->email); return $this->success("注册成功,请前往邮箱激活您的账号!"); } else { return $this->error("注册失败"); } } } /** * @param string $email 邮箱账号 */ private function sendActivationMail($email = "") { $jobName = "appindexjobsendActivationMail"; //负责处理队列任务的类 $data = ["email" => $email]; //当前任务所需的业务数据 $jobQueueName = "sendActivationMail"; //当前任务归属的队列名称,如果为新队列,会自动创建 $result = Queue::push($jobName, $data, $jobQueueName); if ($result) { echo date("Y-m-d H:i:s") . "一个新的队列任务"; } else { echo date("Y-m-d H:i:s") . "添加队列出错"; } // php think queue:work --queue sendActivationMail --daemon } }
sendActivationMail.php 代码
sendMail($data); //如果发送成功 就删除队列 if ($isJobDone) { print ("任务执行成功,,已经删除!" . " "); $job->delete(); } else { //如果执行到这里的话 说明队列执行失败 如果失败三次就删除该任务 否则重新执行 print ("任务执行失败!" . " "); if ($job->attempts() > 3) { print ("删除任务!" . " "); $job->delete(); } else { $job->release(); //重发任务 print ("重新执行!第" . $job->attempts() . "次重新执行! "); } } } /** * 发送邮件 * @param $data * @return bool */ private function sendMail($data) { $title = "账号激活邮件"; $msg = "欢迎您注册xxx网站,您的请点击一下连接激活您的账号!...."; try { return Mail::send($title, $msg, $data["email"]); } catch (Exception $e) { return false; } } }
写完之后再控制器切换到当前目录下 执行
php think queue:work --queue sendActivationMail --daemon
代码里面有很详细的注释,但是这个并不完整,,,没有错误的回调,
等下次有时间的时候再写剩下的代码!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/28790.html
摘要:在路由回调函数里面操作的时候,直接用就可以获取到客户端的值。用回调函数来写后期看起来会很吃力看有没有重名的看是不是同一邮箱又想重复注册如果是以上两种情况,就发送错误信息。此账户名已经被注册。 1. 开场白 用户系统是许多网站的基础。这篇文章主要就是讲解如何写一个基于Node的单页应用的用户系统,这个用户系统的功能包括:注册,登录,自动登录,忘记密码,修改密码,邮件激活。如果使用在后端使...
摘要:可变队列会对长期没有更新动态的那部分不活跃用户进行减缓速度,减缓对他们微博的获取频率,同时加大对活跃用户的获取频率。 注:本文为转载,原文请查看star7th的个人博客。 一、什么是 HTQ 先介绍下基本概念。 我们在编写程序时,偶尔会遇到需要用到异步队列的情况。比如说,我发送一万封邮件,如果单纯使用一个for循环来发送,则执行时间要很长,要等很久才能发完,同时很容易导致阻塞、超时等问...
阅读 3127·2023-04-26 01:30
阅读 646·2021-11-08 13:15
阅读 1716·2021-09-24 10:35
阅读 980·2021-09-22 15:41
阅读 1914·2019-08-30 15:44
阅读 573·2019-08-30 13:22
阅读 990·2019-08-30 13:06
阅读 1172·2019-08-29 13:22