Laravel 隊列使用的實現(xiàn)_第1頁
Laravel 隊列使用的實現(xiàn)_第2頁
Laravel 隊列使用的實現(xiàn)_第3頁
Laravel 隊列使用的實現(xiàn)_第4頁
Laravel 隊列使用的實現(xiàn)_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第Laravel隊列使用的實現(xiàn)Laravel是一種類似ThinkPHP的php框架,封裝的諸多功能可以很方便的使用。隊列Queue便是其中之一。

Windows環(huán)境下,可使用PHPstorm作為Laravel的集成開發(fā)環(huán)境IDE。

2隊列

Laravel可配置多種隊列驅(qū)動,包括"sync","database","beanstalkd","sqs","redis","null"(具體參見app/config/queue.php)

其中sync為同步,database為使用數(shù)據(jù)庫,后面三種為第三方隊列服務(wù),最后一種為不使用隊列。

通過在.env中的QUEUE_CONNECTION選項,來決定選擇何種驅(qū)動。

如QUEUE_CONNECTION=database即為選擇數(shù)據(jù)庫驅(qū)動隊列。

3原理

所謂隊列,會有數(shù)據(jù)的生產(chǎn)者和消費者之分。生產(chǎn)者向隊列中投遞數(shù)據(jù),消費者從隊列中獲取數(shù)據(jù)。

比如向用戶發(fā)送郵件的場景:現(xiàn)在有10w封郵件需要發(fā)送,最簡單的,我們需要有一個方法將郵件的收件人、內(nèi)容等,拆分成10w條任務(wù)放在隊列中,同時需要設(shè)置一個回調(diào)方法負責處理每條任務(wù)。當隊列中有郵件發(fā)送任務(wù)時,隊列會主動調(diào)用回調(diào)方法,并傳遞任務(wù)詳情進去。回調(diào)方法處理完成后,單條郵件即發(fā)送完畢。其他郵件依樣處理。

4使用數(shù)據(jù)庫驅(qū)動隊列

4.1生成任務(wù)表

在終端下輸入

phpartisanqueue:table

phpartisanmigrate

在數(shù)據(jù)庫連接正常的情況下,會在數(shù)據(jù)庫中出現(xiàn)jobs表:

[id]bigint

[queue]nvarchar(255)

[payload]nvarchar(max)

[attempts]tinyint

[reserved_at]int

[available_at]int

[created_at]int

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

phpartisanmake:jobSendEmail

在終端內(nèi)執(zhí)行上述命令,會自動生成app/Jobs/SendMail.php文件

classSendMailimplementsShouldQueue

在該文件的handle方法中,可以放置任務(wù)處理邏輯。

4.3發(fā)送任務(wù)

在任意位置,均可像下面一樣調(diào)用dispatch發(fā)送任務(wù)

SendMail::dispatch($email);

4.4驅(qū)動隊列

完成上述步驟后,可以在數(shù)據(jù)庫中發(fā)現(xiàn)一條記錄(導(dǎo)出為insertSQL語句):

復(fù)制代碼代碼如下:INSERTINTO[jobs]([id],[queue],[payload],[attempts],[reserved_at],[available_at],[created_at])VALUES(6,N'default',N'{"displayName":"App\\Jobs\\ProcessPodcast","job":"Illuminate\\Queue\\CallQueuedHandler@call","maxTries":null,"timeout":null,"timeoutAt":null,"data":{"commandName":"App\\Jobs\\ProcessPodcast","command":"O:23:\"App\\Jobs\\ProcessPodcast\":8:{s:29:\"\u0000App\\Jobs\\ProcessPodcast\u0000data\";s:6:\"111222\";s:6:\"\u0000*\u0000job\";N;s:10:\"connection\";N;s:5:\"queue\";N;s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:5:\"delay\";N;s:7:\"chained\";a:0:{}}"}}',0,NULL,1545980176,1545980176);

此時任務(wù)已經(jīng)放置在數(shù)據(jù)庫內(nèi),只有將隊列運行起來后,隊列才能主動調(diào)用回調(diào)方法。

phpartisanqueue:work

在終端內(nèi)運行上述命令即可。該命令還有諸多參數(shù),如deamon、tries等,可根據(jù)需要指定。

4.5守護進程

為了保證應(yīng)用服務(wù)的穩(wěn)定性,需要開啟守護進程。

Linux下,一般使用Supervisor,Windows下使用Forever

4.6執(zhí)行失敗的處理

對于處理失敗的任務(wù),Laravel也提供的解決方案。通過運行如下命令,即可創(chuàng)建表以記錄失敗任務(wù)。

phpartisanqueue:failed-table

phpartisanmigrate

在數(shù)據(jù)庫中即生成failed_jobs:

[id]bigint

[connection]nvarchar(max)

[queue]nvarchar(max)

[payload]nvarchar(max)

[exception]nvarchar(max)

[failed_at]datetime

導(dǎo)致任務(wù)失敗的Exception會被傳遞到SendMail的failed方法,因而你需要在SendMail中自行實現(xiàn)該方法,并做進一步處理。

任務(wù)執(zhí)行失敗的原因有很多,如傳參錯誤、嘗試次數(shù)超過限制、超時、甚至在handle方法中拋出異常,均會作為失敗任務(wù)處理。

4.7任務(wù)執(zhí)行前后的處理

Laravel提供了任務(wù)執(zhí)行前后的處理入口,即在App/Providers/AppServiceProvider中的boot()中加入如下代碼:

publicfunctionboot()

Queue::before(function(JobProcessing$event){

Log::info("處理任務(wù)前");

Queue::after(function(JobProcessed$event){

Log::info("處理任務(wù)后");

傳遞的$event中,帶有任務(wù)詳情,幾個簡單的例子:

$event-connectionName

$event-job

$event-job-payload()

5使用Redis驅(qū)動隊列

5.1Laravel安裝Predis包

在Laravel中使用Redis之前,需要通過Composer安裝predis/predis包:

composerrequirepredis/predis

上述拓展是幫助Laravel與Redis打交道的,我們現(xiàn)在還缺少Redis服務(wù)。

如果此時將.env中的QUEUE_CONNECTION改為redis,訪問時會報錯:

Predis\Connection\ConnectionException(10061)

[tcp://127.0.0.1:6379]

5.2配置Redis服務(wù)

在Redis官網(wǎng)下載源碼后自行編譯即可。

官方并未提供Windows版,Redis的Windows版式由微軟工作組維護的,你可以從其GitHub頁找到。不過貌似已經(jīng)不再維護了,最新的版本是16年發(fā)布的3.2.100。

Linux下通過簡單的運行

./redis-server

即可開啟服務(wù),再通過

./redis-cli

來嘗試使用Redis。使用也很簡單,就是setkeyvalue和getkey。

Windows下安裝后,在命令行中cd到安裝目錄

C:\ProgramFiles\Redisredis-serverredis.windows.conf

C:\ProgramFiles\Redisnetstat-an

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論