安裝

composer require topthink/think-queue

配置

配置文件位于?config/queue.php

公共配置

[
    'default'=>'sync' //驅(qū)動(dòng)類型,可選擇 sync(默認(rèn)):同步執(zhí)行,database:數(shù)據(jù)庫(kù)驅(qū)動(dòng),redis:Redis驅(qū)動(dòng),topthink:Topthink驅(qū)動(dòng)
                   //或其他自定義的完整的類名
]

驅(qū)動(dòng)配置

各個(gè)驅(qū)動(dòng)的具體可用配置項(xiàng)在thinkqueueconnector目錄下各個(gè)驅(qū)動(dòng)類里的options屬性中,寫在上面的queue配置里即可覆蓋

創(chuàng)建任務(wù)類

單模塊項(xiàng)目推薦使用?appjob?作為任務(wù)類的命名空間 多模塊項(xiàng)目可用使用?appmodulejob?作為任務(wù)類的命名空間 也可以放在任意可以自動(dòng)加載到的地方

任務(wù)類不需繼承任何類,如果這個(gè)類只有一個(gè)任務(wù),那么就只需要提供一個(gè)fire方法就可以了,如果有多個(gè)小任務(wù),就寫多個(gè)方法,下面發(fā)布任務(wù)的時(shí)候會(huì)有區(qū)別
每個(gè)方法會(huì)傳入兩個(gè)參數(shù)?thinkqueueJob $job(當(dāng)前的任務(wù)對(duì)象) 和?$data(發(fā)布任務(wù)時(shí)自定義的數(shù)據(jù))

還有個(gè)可選的任務(wù)失敗執(zhí)行的方法?failed?傳入的參數(shù)為$data(發(fā)布任務(wù)時(shí)自定義的數(shù)據(jù))

下面寫兩個(gè)例子

namespace appjob;

use thinkqueueJob;

class Job1{
    
    public function fire(Job $job, $data){
    
            //....這里執(zhí)行具體的任務(wù) 
            
             if ($job->attempts() > 3) {
                  //通過(guò)這個(gè)方法可以檢查這個(gè)任務(wù)已經(jīng)重試了幾次了
             }
            
            
            //如果任務(wù)執(zhí)行成功后 記得刪除任務(wù),不然這個(gè)任務(wù)會(huì)重復(fù)執(zhí)行,直到達(dá)到最大重試次數(shù)后失敗后,執(zhí)行failed方法
            $job->delete();
            
            // 也可以重新發(fā)布這個(gè)任務(wù)
            $job->release($delay); //$delay為延遲時(shí)間
          
    }
    
    public function failed($data){
    
        // ...任務(wù)達(dá)到最大重試次數(shù)后,失敗了
    }

}
namespace applibjob;

use thinkqueueJob;

class Job2{
    
    public function task1(Job $job, $data){
    
          
    }
    
    public function task2(Job $job, $data){
    
          
    }
    
    public function failed($data){
    
          
    }

}

發(fā)布任務(wù)

thinkQueue::push($job, $data = '', $queue = null)?和?thinkQueue::later($delay, $job, $data = '', $queue = null)?兩個(gè)方法,前者是立即執(zhí)行,后者是在$delay秒后執(zhí)行

$job?是任務(wù)名
單模塊的,且命名空間是appjob的,比如上面的例子一,寫Job1類名即可
多模塊的,且命名空間是appmodulejob的,寫model/Job1即可
其他的需要些完整的類名,比如上面的例子二,需要寫完整的類名applibjobJob2
如果一個(gè)任務(wù)類里有多個(gè)小任務(wù)的話,如上面的例子二,需要用@+方法名applibjobJob2@task1、applibjobJob2@task2

$data?是你要傳到任務(wù)里的參數(shù)

$queue?隊(duì)列名,指定這個(gè)任務(wù)是在哪個(gè)隊(duì)列上執(zhí)行,同下面監(jiān)控隊(duì)列的時(shí)候指定的隊(duì)列名,可不填

監(jiān)聽(tīng)任務(wù)并執(zhí)行

php think queue:listen

php think queue:work

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

可配合supervisor使用,保證進(jìn)程常駐

  1. //執(zhí)行一行
  2. php?think?queue:work?--queue?-v
  3. //循環(huán)執(zhí)行
  4. php?think?queue:work?--daemon