圖文講解think-queue的使用之用戶注冊場景異步發送郵件

本文由thinkphp框架教程欄目給大家介紹think-queue的使用之用戶注冊場景異步發送郵件,希望對需要的朋友有所幫助!

本地環境:

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

最近看到think-queue這個擴展類 但是手冊沒寫,很是頭疼,找了很多資料最后寫了個場景,寫的不好大家見諒
首先我們創建項目 下載tp框架以及think-queue擴展

創建項目:
圖文講解think-queue的使用之用戶注冊場景異步發送郵件
進入項目目錄查看:
圖文講解think-queue的使用之用戶注冊場景異步發送郵件

下載擴展類
圖文講解think-queue的使用之用戶注冊場景異步發送郵件

下載完畢進入查看一下:
圖文講解think-queue的使用之用戶注冊場景異步發送郵件

之后使用MAMP創建虛擬機
圖文講解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 appindexcontroller;  use thinkController; use appindexmodelMember as MemberModel; use appindexvalidateRegister as RegisterValidate; use thinkQueue;  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 = 'appindexjobsendActivationMail';  //負責處理隊列任務的類         $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 appindexjob;  use thinkqueueJob; use PHPMailerMail; use thinkException;  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的使用之用戶注冊場景異步發送郵件

代碼里面有很詳細的注釋,但是這個并不完整,,,沒有錯誤的回調,
等下次有時間的時候再寫剩下的代碼!

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享