• 技术文章 >php框架 >ThinkPHP

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

    藏色散人藏色散人2021-08-31 08:58:33转载170
    本文由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的使用之用户注册场景异步发送邮件的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault,如有侵犯,请联系admin@php.cn删除
    专题推荐:think-queue
    上一篇:thinkphp中.htaccess文件的巧妙运用 下一篇:thinkphp5整合phpsocketio过程亲自踩的坑!
    线上培训班

    相关文章推荐

    • 有关ThinkAPI短信服务的详细介绍• ThinkPHP有三种方式收集表单数据• 一文详解thinkphp控制器的定义和使用• thinkphp中.htaccess文件的巧妙运用

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网