thinkphp6 消息隊列(queue)使用方法 (發送郵件示例)


1、首先,你需要在你的框架中下載queue這個擴展

composer require topthink/think-queue

2.公共配置,配置文件位於:config/queue.php

return [
    'default'     => 'redis',
    'connections' => [
        'sync'     => [
            'type' => 'sync',
        ],
        'database' => [
            'type'       => 'database',
            'queue'      => 'default',
            'table'      => 'jobs',
            'connection' => null,
        ],
        'redis'    => [
            'type'       => 'redis',
            'queue'      => 'default',
            'host'       => '127.0.0.1',
            'port'       => 6379,
            'password'   => '',
            'select'     => 0,
            'timeout'    => 0,
            'persistent' => false,
        ],
    ],
    'failed'      => [
        'type'  => 'none',
        'table' => 'failed_jobs',
    ],
];

你可以在配置文件中選擇你需要使用數據庫的類型,根據自己的需求使用,這里我選擇的是redis

 'default'=>'sync' //驅動類型,可選擇 sync(默認):同步執行,database:數據庫驅動,redis:Redis驅動//或其他自定義的完整的類名

3.創建任務類

單模塊項目推薦使用 app\job 作為任務類的命名空間

多模塊項目可用使用 app\module\job 作為任務類的命名空間 也可以放在任意可以自動加載到的地方

 

我這里是在  app\admin\job  創建了這個任務類

里面執行了我發送郵件的任務,這里的例子可以實現延遲發送郵件的任務

示例代碼如下

<?php
namespace app\admin\job;
use think\facade\Log;
use think\queue\Job;
use tool\SendMail;

class Test
{
    public function fire(Job $job, $data){
        if ($job->attempts()>3){
            //執行失敗寫入錯誤日志
            Log::error('fire執行失敗');
            //刪除這個任務
            $job->delete();
        }else{
            $toemail="407489255@qq.com"; //定義收件人的郵箱
            $username="407486225@qq.com"; //發送方的郵箱地址
            $password="qmxrvjgohiucbbgj"; //發送方郵箱的密碼
            $setFrom="1223524552@qq.com"; //設置發件人信息
            $addReplyTo="1003729782@qq.com";   //設置收件人信息
            $contrnt="郵件內容是 <b>您的驗證碼是:123456</b>,哈哈哈!111122";   //設置郵件內容
            SendMail::sendMail($toemail,$username,$password,$setFrom,$addReplyTo,$contrnt);
            //執行成功刪除這個任務
            $job->delete();
        }

    }

}



這個是發送郵件的封住類 配合上面的使用
<?php
namespace tool;
use PHPMailer\PHPMailer\PHPMailer;


class SendMail
{
    public static function sendMail($toemail,$username,$password,$setFrom,$addReplyTo,$contrnt)
    {
        $toemail ="$toemail";//定義收件人的郵箱

        $mail = new PHPMailer();

        $mail->isSMTP();// 使用SMTP服務
        $mail->CharSet = "utf8";// 編碼格式為utf8,不設置編碼的話,中文會出現亂碼
        $mail->Host = "smtp.qq.com";// 發送方的SMTP服務器地址
        $mail->SMTPAuth = true;// 是否使用身份驗證
        $mail->Username = "$username";// 發送方的163郵箱用戶名,就是你申請163的SMTP服務使用的163郵箱</span><span style="color:#333333;">
        $mail->Password = "$password";// 發送方的郵箱密碼,注意用163郵箱這里填寫的是“客戶端授權密碼”而不是郵箱的登錄密碼!</span><span style="color:#333333;">
        $mail->SMTPSecure = "ssl";// 使用ssl協議方式</span><span style="color:#333333;">
        $mail->Port = 465;// 163郵箱的ssl協議方式端口號是465/994

        $mail->setFrom("$setFrom", "Mailer");// 設置發件人信息,如郵件格式說明中的發件人,這里會顯示為Mailer(xxxx@163.com),Mailer是當做名字顯示
        $mail->addAddress($toemail, 'Wang');// 設置收件人信息,如郵件格式說明中的收件人,這里會顯示為Liang(yyyy@163.com)
        $mail->addReplyTo("$addReplyTo", "Reply");// 設置回復人信息,指的是收件人收到郵件后,如果要回復,回復郵件將發送到的郵箱地址
        //$mail->addCC("xxx@163.com");// 設置郵件抄送人,可以只寫地址,上述的設置也可以只寫地址(這個人也能收到郵件)
        //$mail->addBCC("xxx@163.com");// 設置秘密抄送人(這個人也能收到郵件)
        //$mail->addAttachment("bug0.jpg");// 添加附件


        $mail->Subject = "這是一個測試郵件";// 郵件標題
        $mail->Body = "$contrnt";// 郵件正文
        //$mail->AltBody = "This is the plain text純文本";// 這個是設置純文本方式顯示的正文內容,如果不支持Html方式,就會用到這個,基本無用

        if (!$mail->send()) {// 發送郵件
            echo "Message could not be sent.";
            echo "Mailer Error: " . $mail->ErrorInfo;// 輸出錯誤信息
        } else {
            echo '發送成功';
        }
    }
}

 

 

4.發布任務   控制器調用這個  進入發布任務

<?php
declare (strict_types = 1);

namespace app\admin\controller;
use think\facade\Queue;
use think\Request;


class index
{
    /**
     * 顯示資源列表
     *
     * @return \think\Response
     */
    public function index()
    {
        //設置執行這個任務 
        Queue::later('20','app\admin\job\Test@fire',['name'=>'Test'],'fire');
    }

 

注:一寫參數的解釋與使用方法

think\facade\Queue::push($job, $data = '', $queue = null) 和 think\facade\Queue::later($delay, $job, $data = '', $queue = null) 兩個方法,前者是立即執行,后者是在$delay秒后執行

$job 是任務名
單模塊的,且命名空間是app\job的,比如上面的例子一,寫Job1類名即可
多模塊的,且命名空間是app\module\job的,寫model/Job1即可
其他的需要些完整的類名,比如上面的例子二,需要寫完整的類名app\lib\job\Job2
如果一個任務類里有多個小任務的話,如上面的例子二,需要用@+方法名app\lib\job\Job2@task1app\lib\job\Job2@task2

$data 是你要傳到任務里的參數

$queue 隊列名,指定這個任務是在哪個隊列上執行,同下面監控隊列的時候指定的隊列名,可不填

 

5.監聽任務並執行

這是我的執行的方法

php think queue:listen --queue fire

 

 

參數解釋

php think queue:listen

php think queue:work

 

兩種,具體的可選參數可以輸入命令加 --help 查看

可配合supervisor使用,保證進程常駐


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM