专栏首页每天进步一点点think-queue使用教程-用户注册场景异步发送邮件

think-queue使用教程-用户注册场景异步发送邮件

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

<?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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • think-queue 解析上

    分析之前请大家务必了解消息队列的实现 如果不了解请先阅读下: 有赞消息队列设计 去哪儿网消息队列设计

    李昊天
  • think-queue 解析上

    tp5的消息队列是基于database redis 和tp官方自己实现的 Topthink

    李昊天
  • 使用electron制作满屏心特效

    这样就会让窗口全屏 但是有一个问题 就是这样做界面不会正确响应 我们可以使用进程通信去解决

    李昊天
  • 还是不靠谱!多维LSTM网络预测比特币价格【机器学习应用区块链系列二】

    量化投资与机器学习 为中国的量化投资事业贡献一份我们的力量! ? 公众号今天为大家带来机器学习应用区块链系列的第二篇文章。 这篇文章的作者是公众号之前推过一位...

    量化投资与机器学习微信公众号
  • Python中的数据标准化

    数据标准化 数据标准化是指将数据按比例缩放,使之落入到特定区间。 为了消除量纲的影响,方便进行不同变量间的比较分析。 0-1标准化: x=(x-min)/(ma...

    Erin
  • 12种用于Python数据分析的Pandas技巧

    本文将介绍12种用于数据分析的Pandas技巧,为了更好地描述它们的效果,这里我们用一个数据集辅助进行操作。

    崔庆才
  • 深入浅出谈「大数据」| MTdata小讲堂

    美图数据技术团队
  • python3 django整理(七) Django 从后台往前台传递数据时有多种方法可以实现。

    Django 从后台往前台传递数据时有多种方法可以实现。 基础形式: from django.shortcuts import render def main...

    学到老
  • python开发:特征工程代码模版(一)

    作为一个算法工程师,我们接的业务需求不会比数据分析挖掘工程师少,作为一个爱偷懒的人,总机械重复的完成一样的预处理工作,我是不能忍的,所以在最近几天,我正在完善一...

    sladesal
  • Python中时间格式数据的处理

    1、时间转换 时间转换是指字符型的时间格式数据,转换成为时间型数据的过程。 一般从csv导入过来的文件,时间都保存为字符型格式的,需要转换。 时间转换函数: d...

    Erin

扫码关注云+社区

领取腾讯云代金券