>  기사  >  PHP 프레임워크  >  사용자 등록 시나리오에서 think-queue를 사용하여 비동기적으로 이메일을 보내는 방법에 대한 그래픽 설명

사용자 등록 시나리오에서 think-queue를 사용하여 비동기적으로 이메일을 보내는 방법에 대한 그래픽 설명

藏色散人
藏色散人앞으로
2021-08-30 17:11:222307검색

이 기사는 thinkphpFramework Tutorial 칼럼에서 사용자 등록 시나리오에서 비동기적으로 이메일을 보내기 위한 think-queue 사용을 소개하기 위해 작성되었습니다. 도움이 필요한 친구들에게 도움이 되기를 바랍니다.

로컬 환경:

시스템 상태: Mac Os
php 버전: 7.1
ThinkPHP 버전: 5.1.15

최근에 think-를 봤습니다. queue 이 확장 클래스는 매뉴얼에 작성되어 있지 않아서 머리가 아팠습니다. 많은 정보를 찾아 결국 장면을 작성했습니다. 먼저 tp 프레임워크를 다운로드하여 프로젝트를 작성했습니다. -queue 확장을 만듭니다.


보려면 프로젝트 디렉터리를 입력하세요. 사용자 등록 시나리오에서 think-queue를 사용하여 비동기적으로 이메일을 보내는 방법에 대한 그래픽 설명

확장 클래스를 다운로드하세요. 사용자 등록 시나리오에서 think-queue를 사용하여 비동기적으로 이메일을 보내는 방법에 대한 그래픽 설명


다운로드 후 다음을 입력하고 확인하세요. 사용자 등록 시나리오에서 think-queue를 사용하여 비동기적으로 이메일을 보내는 방법에 대한 그래픽 설명


그런 다음 MAMP를 사용하여 가상을 만듭니다. 사용자 등록 시나리오에서 think-queue를 사용하여 비동기적으로 이메일을 보내는 방법에 대한 그래픽 설명


그런 다음 데이터베이스와 데이터 테이블을 생성합니다. 사용자 등록 시나리오에서 think-queue를 사용하여 비동기적으로 이메일을 보내는 방법에 대한 그래픽 설명

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 서비스를 시작합니다.


그 후 필수 라우팅 켜기, 데이터베이스 구성, 라우팅 구성, 템플릿 태그 구성과 같은 일련의 작업이 수행됩니다. 등... 사용자 등록 시나리오에서 think-queue를 사용하여 비동기적으로 이메일을 보내는 방법에 대한 그래픽 설명

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 = &#39;&#39;;

    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

코드에 매우 자세한 설명이 있지만 이는 완료되지 않았습니다.,, 오류 콜백이 없습니다. 사용자 등록 시나리오에서 think-queue를 사용하여 비동기적으로 이메일을 보내는 방법에 대한 그래픽 설명나머지는 제가 작성하겠습니다. 코드는 다음에 시간날 때

위 내용은 사용자 등록 시나리오에서 think-queue를 사용하여 비동기적으로 이메일을 보내는 방법에 대한 그래픽 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제