隊列驅動支持
config/queue.php
每一個隊列驅動都基於底層鏈接,且經過屬性queue
指定默認隊php
Redis、Beanstalkd、Database(需:php artisan queue:table && php artisan migrate)、Sqs、IronMQ
等sysnc同步驅動(當即執行Job)
、null驅動(簡單丟棄Job)
RabbitMQ、Kafka
等Fail表準備html
php artisan queue:failed-table php artisan migrate
php artisan make:job MyJob
(默認實現接口ShouldQueue
以隊列化的異步執行)model實例
,則僅有ID
會被序列化並存入隊列,消費時經過ID
於數據庫從新取回$myJob = new MyJob(); dispatch($myJob);
handle
方法:Job
消費邏輯failed(Exception $exception)
方法:Job
失敗後的收尾邏輯Job
建議投遞到同一隊列上(好比短信Job
和郵件Job
都投遞到notification
隊列上)$myJob->delay(Carbon::now()->addMinutes(10))
$myJob->onQueue(指定隊)
$myJob->onConnection(指定鏈接)
public $tries = 3;
(Job執行中發生Excepion則被退回隊列並重試)public $timeout = 60;
(秒)##Queue執行數據庫
--queue
參數前後順序可指定優先級# 啓動隊列執行器 * 生產環境(高效模式):php artisan queue:work --daemon [--quiet ] [--delay=3] [--sleep=隊列空後的休眠時間] [--tries=3] [--timeout=30] [--memory=默認128M] [--queue=隊列1,隊列2] [指定鏈接] * 測試環境(每次重載上下文):php artisan queue:listen [--tries=3] [--timeout=30] [--sleep=隊列空後的休眠時間] [--queue=隊列1,隊列2] [指定鏈接] # 重啓隊列執行器(以便在項目部署時重載代碼上下文) php artisan queue:restart
retry_after
屬性)指定了Job
重試的等待時間--timeout
)指定了處理Job
的子隊列執行器被kill
前的超時時間Job
會先超時被kill
,而後在到達過時時間後被重試失敗流程bash
Job
失敗,執行failed(Exception $exception)
方法中失敗後的收尾邏輯Job
在最終嘗試後還失敗,則入表failed_jobs
FailedJob處理異步
php artisan queue:failed
php artisan queue:retry all|jobID
php artisan queue:forget all|jobID
php artisan queue:flush
# AppServiceProvider::boot 中註冊Job事件的監聽 //$event->connectionName //$event->job->payload() //$event->exception Queue::before(function(JobProcessing $event){}); Queue::after(function(JobProcessed $event){}); Queue::failing(function(JobFailed $event){}); # queue worker請求Job前 Queue::looping(function(){ # 可處理一些回滾 while (DB::transactionLevel() > 0) { DB::rollBack(); } });
經過supervisor
啓動隊列消費服務ide
進程守護
隊列消費服務多進程
方式消費隊列中的Job
配置函數
# /etc/supervisor/conf.d/queue-worker-test.conf [program:queue-worker-test] process_name=%(program_name)s_%(process_num)02d directory=/var/www/html command=php artisan queue:work --daemon --quiet --delay=3 --sleep=3 --tries=3 --memory=1024 --queue=test autostart=true autorestart=true user=www numprocs=5 #當>1時, process_name必須有%(process_num) priority=997 stopsignal=QUIT redirect_stderr=true stdout_logfile=/dev/null stdout_logfile_maxbytes=0 stdout_logfile_backups=0 stderr_logfile=/dev/null stderr_logfile_maxbytes=0 stderr_logfile_backups=0
啓動oop
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start queue-worker-test:*