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@task1
、app\lib\job\Job2@task2
$data
是你要傳到任務里的參數
$queue
隊列名,指定這個任務是在哪個隊列上執行,同下面監控隊列的時候指定的隊列名,可不填
5.監聽任務並執行
這是我的執行的方法
php think queue:listen --queue fire
參數解釋
php think queue:listen
php think queue:work
兩種,具體的可選參數可以輸入命令加 --help 查看
可配合supervisor使用,保證進程常駐