淺析Laravel5中隊(duì)列的配置及使用
前言
隊(duì)列常常用于兩種場(chǎng)景,一種是高并發(fā)的情況,一種是耗時(shí)的操作,可以將任務(wù)放到隊(duì)列中去,消費(fèi)者從隊(duì)列取任務(wù)執(zhí)行,當(dāng)然還有失敗的情況如何處理,以及延遲,重試,更復(fù)雜的情況還有優(yōu)先級(jí)的實(shí)現(xiàn)。
在Laravel 5中使用隊(duì)列非常簡(jiǎn)單,并且失敗處理,延遲,重試的方法都已經(jīng)實(shí)現(xiàn),下面簡(jiǎn)單嘗試了一下Laravel的隊(duì)列服務(wù)。
Laravel默認(rèn)支持以下幾種隊(duì)列服務(wù):sync
, database
, beanstalkd
, sqs
, redis
,本例使用redis
作為隊(duì)列服務(wù),需先配置好Redis
服務(wù)。
1.隊(duì)列服務(wù)配置
在配置文件queue.php的connections
中已經(jīng)默認(rèn)定義了redis
的連接:
'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'expire' => 60, ],
在.env環(huán)境配置文件中把默認(rèn)的隊(duì)列驅(qū)動(dòng)改成redis
:
QUEUE_DRIVER=redis
為了避免配置緩存的影響,執(zhí)行以下命令清除并重建配置緩存:
php artisan config:cache
2.新建Queueable Jobs
使用命令:
php artisan make:job MyJob
新建一個(gè)名為MyJob的隊(duì)列處理類(lèi),在App/Jobs
目錄下自動(dòng)生成一個(gè)MyJob.php文件。
MyJob.php需要實(shí)現(xiàn)handle
方法,用來(lái)具體執(zhí)行隊(duì)列任務(wù),構(gòu)造函數(shù)可以用來(lái)傳遞需要的參數(shù),handle
方法支持依賴注入。
這里handle
方法隨便寫(xiě)了一個(gè),就是往一個(gè)list
類(lèi)型數(shù)據(jù)結(jié)構(gòu)中存一個(gè)key-value
數(shù)據(jù),測(cè)試消費(fèi)隊(duì)列的時(shí)候有沒(méi)有起作用,構(gòu)造函數(shù)傳兩個(gè)參數(shù)就是key
和value
.
<?php namespace App\Jobs; use App\Jobs\Job; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Support\Facades\Redis; class MyJob extends Job implements ShouldQueue { use InteractsWithQueue, SerializesModels; private $key; private $value; /** * Create a new job instance. * * @return void */ public function __construct($key, $value) { $this->key = $key; $this->value = $value; } /** * Execute the job. * * @return void */ public function handle() { Redis::hset('queue.test', $this->key, $this->value); } public function failed() { dump('failed'); } }
在控制器中使用dispatch
方法調(diào)用隊(duì)列,將任務(wù)放入隊(duì)列中,控制器中寫(xiě)個(gè)方法如public function test()
,new MyJob
的構(gòu)造函數(shù)傳兩個(gè)隨機(jī)生成的字符串參數(shù):
$queueId = $this->dispatch(new MyJob('key_'.str_random(4), str_random(10))); dd($queueId);
配置并訪問(wèn)路由,可以多訪問(wèn)幾次,然后到Redis
中查看,會(huì)發(fā)現(xiàn)把隊(duì)列存入了一個(gè)queue::queue:default
的List
結(jié)構(gòu)中:
其中value
內(nèi)容如下,這是轉(zhuǎn)換成json
格式的,而實(shí)際上是經(jīng)過(guò)序列號(hào)的字符串:
{ "job": "Illuminate\\Queue\\CallQueuedHandler@call", "data": { "command": "O:14:\"App\\Jobs\\MyJob\":6:{s:19:\"\u0000App\\Jobs\\MyJob\u0000key\";i:1;s:21:\"\u0000App\\Jobs\\MyJob\u0000value\";i:2;s:10:\"connection\";N;s:5:\"queue\";N;s:5:\"delay\";N;s:6:\"\u0000*\u0000job\";N;}" }, "id": "EV2bhqUlx0T8pRCVHw1qT0fkP8AQcyI8", "attempts": 1 }
這里data
參數(shù)里包含了隊(duì)列服務(wù)Job
的名稱,構(gòu)造函數(shù)的參數(shù)等信息,消費(fèi)者執(zhí)行任務(wù)的依據(jù)。attempts
表示重試的次數(shù),往往執(zhí)行隊(duì)列任務(wù)失敗了會(huì)重試,可以設(shè)置最多嘗試次數(shù)。
3.消費(fèi)隊(duì)列
這個(gè)時(shí)候任務(wù)只是入了隊(duì)列,但并沒(méi)有消費(fèi),執(zhí)行:
php artisan queue:listen
這個(gè)命令,Laravel就開(kāi)始消費(fèi)隊(duì)列。
可以看到這幾個(gè)任務(wù)以此被消費(fèi),再去Redis
看看有沒(méi)有實(shí)現(xiàn)預(yù)期要達(dá)到的效果,每個(gè)任務(wù)往一個(gè)List
類(lèi)型的結(jié)構(gòu)寫(xiě)入數(shù)據(jù)。
這證明隊(duì)列任務(wù)消費(fèi)成功。
總結(jié)
本文的內(nèi)容到這就結(jié)束了,當(dāng)然,還有更多Laravel隊(duì)列的用法,可以請(qǐng)大家繼續(xù)參考官方手冊(cè)。希望本文的內(nèi)容對(duì)大家學(xué)習(xí)Laravel有所幫助。
- laravel5.6 框架郵件隊(duì)列database驅(qū)動(dòng)簡(jiǎn)單demo示例
- Laravel使用Queue隊(duì)列的技巧匯總
- Docker部署Laravel應(yīng)用實(shí)現(xiàn)隊(duì)列&任務(wù)調(diào)度
- Laravel 6 將新增為指定隊(duì)列任務(wù)設(shè)置中間件的功能
- Laravel 隊(duì)列使用的實(shí)現(xiàn)
- Laravel框架隊(duì)列原理與用法分析
- Laravel中為什么不使用blpop取隊(duì)列詳析
- 關(guān)于 Laravel Redis 多個(gè)進(jìn)程同時(shí)取隊(duì)列問(wèn)題詳解
- 源碼分析 Laravel 重復(fù)執(zhí)行同一個(gè)隊(duì)列任務(wù)的原因
- Laravel使用消息隊(duì)列需要注意的一些問(wèn)題
- Laravel中利用隊(duì)列發(fā)送郵件的方法示例
- 淺談Laravel隊(duì)列實(shí)現(xiàn)原理解決問(wèn)題記錄
- PHP的Laravel框架中使用消息隊(duì)列queue及異步隊(duì)列的方法
- Laravel 4.2 中隊(duì)列服務(wù)(queue)使用感受
- Laravel框架中隊(duì)列和工作(Queues、Jobs)操作實(shí)例詳解
相關(guān)文章
PHP中使用addslashes函數(shù)轉(zhuǎn)義的安全性原理分析
這篇文章主要介紹了PHP中使用addslashes函數(shù)轉(zhuǎn)義的安全性原理分析,較為深入的分析了addslashes函數(shù)的用法及ecshop自定義函數(shù)addslashes_deep的不足之處,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11php簡(jiǎn)單開(kāi)啟gzip壓縮方法(zlib.output_compression)
網(wǎng)上的教程基本是你抄我來(lái)我抄他,不外乎加頭加尾或者自構(gòu)函數(shù)兩種寫(xiě)法。實(shí)際上每個(gè)php頁(yè)面都要去加代碼——當(dāng)然也可以include引用,不過(guò)總顯得略微麻煩2013-04-04PHP命名空間namespace及use的簡(jiǎn)單用法分析
這篇文章主要介紹了PHP命名空間namespace及use的簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了php命名空間的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-08-08php獲取服務(wù)器端mac和客戶端mac的地址支持WIN/LINUX
這篇文章主要介紹了php獲取服務(wù)器端mac和客戶端mac地址的方法,需要的朋友可以參考下2014-05-05php采用curl模仿登錄人人網(wǎng)發(fā)布動(dòng)態(tài)的方法
這篇文章主要介紹了php采用curl模仿登錄人人網(wǎng)發(fā)布動(dòng)態(tài)的方法,分析了curl登陸人人網(wǎng)的原理與具體方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11php計(jì)數(shù)排序算法的實(shí)現(xiàn)代碼(附四個(gè)實(shí)例代碼)
計(jì)數(shù)排序(Counting sort)是一種根據(jù)小整數(shù)鍵對(duì)一組對(duì)象排序的算法;也就是說(shuō),它是一個(gè)整數(shù)排序算法。它通過(guò)計(jì)算具有不同鍵值的對(duì)象的數(shù)量,并對(duì)這些數(shù)量使用算術(shù)來(lái)確定輸出序列中每個(gè)鍵值的位置2020-03-03php simplexmlElement操作xml的命名空間實(shí)現(xiàn)代碼
這是今天中午發(fā)生的事情,有人在群里求助,比如xml中如果標(biāo)記是<xx:xxxx>content</xx:xxxx>這樣的情況下,取不到 xx:xxxx 為下標(biāo)的值。2011-01-01