think-queue使用教程-用户注册场景异步发送邮件
本地环境:
系统是:Mac Os
php版本:7.1
ThinkPHP版本:5.1.15

最近看到think-queue这个扩展类 但是手册没写,很是头疼,找了很多资料最后写了个场景,写的不好大家见谅
首先我们创建项目 下载tp框架以及think-queue扩展

创建项目:

进入项目目录查看:

下载扩展类

下载完毕进入查看一下:

之后使用MAMP(妈卖麻痹)创建虚拟机

之后创建数据库以及数据表;

  1. create database if not exists myproject;
  2. use myproject;
  3. DROP TABLE IF EXISTS member;
  4. CREATE TABLE IF NOT EXISTS member(
  5.   id int(11) AUTO_INCREMENT primary key comment ‘ID’,
  6.   email VARCHAR(32) NOT NULL DEFAULT  COMMENT ,
  7.   password VARCHAR(255) NOT NULL default  comment ,
  8.   create_time INT(11) UNSIGNED NOT NULL DEFAULT 0 comment ,
  9.   update_time INT(11) UNSIGNED NOT NULL DEFAULT 0 comment ,
  10.   unique key (email)
  11. )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控制器里面创建操作方法

  1. <?php
  2. /**
  3.  * User: 李昊天
  4.  * Date: 18/6/7
  5.  * Time: 上午3:15
  6.  * Email: haotian0607@gmail.com
  7.  */
  8. namespace app\index\controller;
  9. use think\Controller;
  10. use app\index\model\Member as MemberModel;
  11. use app\index\validate\Register as RegisterValidate;
  12. use think\Queue;
  13. class Register extends Controller
  14. {
  15.     private $model = ;
  16.     public function initialize()
  17.     {
  18.         $this->model = new MemberModel();
  19.     }
  20.     /**
  21.      * 渲染模板 展示注册页面
  22.      * @return mixed
  23.      */
  24.     public function index()
  25.     {
  26.         return $this->fetch(‘index’);
  27.     }
  28.     /**
  29.      * 执行注册逻辑
  30.      */
  31.     public function doRegister()
  32.     {
  33.         if ($this->request->isPost()) {
  34.             #实例化验证器 执行验证 如果验证失败跳转并且提示
  35.             $validate = new RegisterValidate();
  36.             $data = $this->request->post();
  37.             if (false === $validate->check($data)) return $this->error($validate->getError());
  38.             //此处应该加密密码 md5 sha1 hash 都可以
  39.             //写入注册的用户
  40.             $result = $this->model->allowField([’email’, ‘password’])->save($data);
  41.             if ($result) {
  42.                 //注册完毕后获取到邮件账号  然后加入到队列
  43.                 $this->sendActivationMail($this->model->email);
  44.                 return $this->success(‘注册成功,请前往邮箱激活您的账号!’);
  45.             } else {
  46.                 return $this->error(‘注册失败’);
  47.             }
  48.         }
  49.     }
  50.     /**
  51.      * @param string $email 邮箱账号
  52.      */
  53.     private function sendActivationMail($email = )
  54.     {
  55.         $jobName = ‘app\index\job\sendActivationMail’;  //负责处理队列任务的类
  56.         $data = [’email’ => $email]; //当前任务所需的业务数据
  57.         $jobQueueName = ‘sendActivationMail’; //当前任务归属的队列名称,如果为新队列,会自动创建
  58.         $result = Queue::push($jobName, $data, $jobQueueName);
  59.         if ($result) {
  60.             echo date(‘Y-m-d H:i:s’) . ‘一个新的队列任务’;
  61.         } else {
  62.             echo date(‘Y-m-d H:i:s’) . ‘添加队列出错’;
  63.         }
  64.         // php think queue:work –queue sendActivationMail –daemon
  65.     }
  66. }

复制代码

sendActivationMail.php 代码

  1. <?php
  2. /**
  3.  * User: 李昊天
  4.  * Date: 18/6/7
  5.  * Time: 上午3:36
  6.  * Email: haotian0607@gmail.com
  7.  */
  8. namespace app\index\job;
  9. use think\queue\Job;
  10. use PHPMailer\Mail;
  11. use think\Exception;
  12. class sendActivationMail
  13. {
  14.     /**
  15.      * fire方法是消息队列默认调用的方法
  16.      * @param Job $job 当前的任务对象
  17.      * @param $data 发布任务时自定义的数据
  18.      */
  19.     public function fire(Job $job, $data)
  20.     {
  21.         //执行发送邮件
  22.         $isJobDone = $this->sendMail($data);
  23.         //如果发送成功  就删除队列
  24.         if ($isJobDone) {
  25.             print (“<warn>任务执行成功,,已经删除!” . “</warn>\n”);
  26.             $job->delete();
  27.         } else {
  28.             //如果执行到这里的话 说明队列执行失败  如果失败三次就删除该任务  否则重新执行
  29.             print (“<warn>任务执行失败!” . “</warn>\n”);
  30.             if ($job->attempts() > 3) {
  31.                 print (“<warn>删除任务!” . “</warn>\n”);
  32.                 $job->delete();
  33.             } else {
  34.                 $job->release(); //重发任务
  35.                 print (“<info>重新执行!第” . $job->attempts() . “次重新执行!</info>\n”);
  36.             }
  37.         }
  38.     }
  39.     /**
  40.      * 发送邮件
  41.      * @param $data
  42.      * @return bool
  43.      */
  44.     private function sendMail($data)
  45.     {
  46.         $title = ‘账号激活邮件’;
  47.         $msg = ‘欢迎您注册xxx网站,您的请点击一下连接激活您的账号!….’;
  48.         try {
  49.             return Mail::send($title, $msg, $data[’email’]);
  50.         } catch (Exception $e) {
  51.             return false;
  52.         }
  53.     }
  54. }

复制代码

写完之后再控制器切换到当前目录下 执行

  1. php think queue:work queue sendActivationMail daemon

复制代码

代码里面有很详细的注释,但是这个并不完整,,,没有错误的回调,
等下次有时间的时候再写剩下的代码!