您的位置 首页 php

图文讲解think-queue的使用之用户注册场景异步发送邮件

本文由thinkphp框架教程栏目给大家介绍think-queue的使用之用户注册场景异步发送邮件,希望对需要的朋友有所帮助!

本地环境:

系统是:Mac Os
php版本:7.1
ThinkPHP版本:5.1.15

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

创建项目:
3cd29e89e01a9727cd42c54e1dd1dbe.png
进入项目目录查看:
abcbca3032a6e8b65d23ad3ff963278.png

下载扩展类
e036548c8de0b747433f0e117fd3542.png

下载完毕进入查看一下:
317f305d37f7e8bc6bd485720d0196b.png

之后使用MAMP创建虚拟机
9eaca97134133e97ede23b00149c480.png

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

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 服务
9fa32640e1e26cd1177b91acaa5f613.png

之后一些列的操作,比如开启强制路由,配置数据库,配置路由,配置模板标签等….

创建页面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控制器里面创建操作方法

<?php/** * User: 李昊天 * Date: 18/6/7 * Time: 上午3:15 * Email: haotian0607@gmail.com */namespace app\index\controller;use think\Controller;use app\index\model\Member as MemberModel;use app\index\validate\Register as RegisterValidate;use think\Queue;class Register extends Controller{    private $model = '';    public function initialize()    {        $this->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 代码

<?php/** * User: 李昊天 * Date: 18/6/7 * Time: 上午3:36 * Email: haotian0607@gmail.com */namespace app\index\job;use think\queue\Job;use PHPMailer\Mail;use think\Exception;class sendActivationMail{    /**     * fire方法是消息队列默认调用的方法     * @param Job $job 当前的任务对象     * @param $data 发布任务时自定义的数据     */    public function fire(Job $job, $data)    {        //执行发送邮件        $isJobDone = $this->sendMail($data);        //如果发送成功  就删除队列        if ($isJobDone) {            print ("<warn>任务执行成功,,已经删除!" . "</warn>\n");            $job->delete();        } else {            //如果执行到这里的话 说明队列执行失败  如果失败三次就删除该任务  否则重新执行            print ("<warn>任务执行失败!" . "</warn>\n");            if ($job->attempts() > 3) {                print ("<warn>删除任务!" . "</warn>\n");                $job->delete();            } else {                $job->release(); //重发任务                print ("<info>重新执行!第" . $job->attempts() . "次重新执行!</info>\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

2bb031978d995fd7c61ef2e4da03df9.png

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

文章来源:智云一二三科技

文章标题:图文讲解think-queue的使用之用户注册场景异步发送邮件

文章地址:https://www.zhihuclub.com/24815.shtml

关于作者: 智云科技

热门文章

网站地图