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 = 'app\index\job\sendActivationMail'; //负责处理队列任务的类
$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 ("任务执行成功,,已经删除!" . " \n");
$job->delete();
} else {
//如果执行到这里的话 说明队列执行失败 如果失败三次就删除该任务 否则重新执行
print ("任务执行失败!" . " \n");
if ($job->attempts() > 3) {
print ("删除任务!" . " \n");
$job->delete();
} else {
$job->release(); //重发任务
print ("重新执行!第" . $job->attempts() . "次重新执行! \n");
}
}
}
/**
* 发送邮件
* @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
代码里面有很详细的注释,但是这个并不完整,,,没有错误的回调,
等下次有时间的时候再写剩下的代码!