《PHP實(shí)戰(zhàn):淺析Laravel5中隊(duì)列的配置及使用》要點(diǎn):
本文介紹了PHP實(shí)戰(zhàn):淺析Laravel5中隊(duì)列的配置及使用,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
PHP實(shí)戰(zhàn)前言
PHP實(shí)戰(zhàn)隊(duì)列常常用于兩種場(chǎng)景,一種是高并發(fā)的情況,一種是耗時(shí)的操作,可以將任務(wù)放到隊(duì)列中去,消費(fèi)者從隊(duì)列取任務(wù)執(zhí)行,當(dāng)然還有失敗的情況如何處理,以及延遲,重試,更復(fù)雜的情況還有優(yōu)先級(jí)的實(shí)現(xiàn).
PHP實(shí)戰(zhàn)在Laravel 5中使用隊(duì)列非常簡(jiǎn)單,并且失敗處理,延遲,重試的方法都已經(jīng)實(shí)現(xiàn),下面簡(jiǎn)單嘗試了一下Laravel的隊(duì)列服務(wù).
PHP實(shí)戰(zhàn)Laravel默認(rèn)支持以下幾種隊(duì)列服務(wù):sync
, database
, beanstalkd
, sqs
, redis
,本例使用redis
作為隊(duì)列服務(wù),需先配置好Redis
服務(wù).
PHP實(shí)戰(zhàn)1.隊(duì)列服務(wù)配置
PHP實(shí)戰(zhàn)在配置文件queue.php的connections
中已經(jīng)默認(rèn)定義了redis
的連接:
PHP實(shí)戰(zhàn)
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'expire' => 60,
],
PHP實(shí)戰(zhàn)在.env環(huán)境配置文件中把默認(rèn)的隊(duì)列驅(qū)動(dòng)改成redis
:
PHP實(shí)戰(zhàn)
QUEUE_DRIVER=redis
PHP實(shí)戰(zhàn)為了避免配置緩存的影響,執(zhí)行以下命令清除并重建配置緩存:
PHP實(shí)戰(zhàn)
php artisan config:cache
PHP實(shí)戰(zhàn)2.新建Queueable Jobs
PHP實(shí)戰(zhàn)使用命令:
PHP實(shí)戰(zhàn)
php artisan make:job MyJob
PHP實(shí)戰(zhàn)新建一個(gè)名為MyJob的隊(duì)列處理類,在App/Jobs
目錄下自動(dòng)生成一個(gè)MyJob.php文件.
PHP實(shí)戰(zhàn)
PHP實(shí)戰(zhàn)MyJob.php需要實(shí)現(xiàn)handle
方法,用來(lái)具體執(zhí)行隊(duì)列任務(wù),構(gòu)造函數(shù)可以用來(lái)傳遞需要的參數(shù),handle
方法支持依賴注入.
PHP實(shí)戰(zhàn)這里handle
方法隨便寫(xiě)了一個(gè),就是往一個(gè)list
類型數(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實(shí)戰(zhàn)
<?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');
}
}
PHP實(shí)戰(zhàn)在控制器中使用dispatch
方法調(diào)用隊(duì)列,將任務(wù)放入隊(duì)列中,控制器中寫(xiě)個(gè)方法如public function test()
,new MyJob
的構(gòu)造函數(shù)傳兩個(gè)隨機(jī)生成的字符串參數(shù):
PHP實(shí)戰(zhàn)
$queueId = $this->dispatch(new MyJob('key_'.str_random(4), str_random(10)));
dd($queueId);
PHP實(shí)戰(zhàn)配置并訪問(wèn)路由,可以多訪問(wèn)幾次,然后到Redis
中查看,會(huì)發(fā)現(xiàn)把隊(duì)列存入了一個(gè)queue::queue:default
的List
結(jié)構(gòu)中:
PHP實(shí)戰(zhàn)
PHP實(shí)戰(zhàn)其中value
內(nèi)容如下,這是轉(zhuǎn)換成json
格式的,而實(shí)際上是經(jīng)過(guò)序列號(hào)的字符串:
PHP實(shí)戰(zhàn)
{
"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
}
PHP實(shí)戰(zhàn)這里data
參數(shù)里包含了隊(duì)列服務(wù)Job
的名稱,構(gòu)造函數(shù)的參數(shù)等信息,消費(fèi)者執(zhí)行任務(wù)的依據(jù).attempts
表示重試的次數(shù),往往執(zhí)行隊(duì)列任務(wù)失敗了會(huì)重試,可以設(shè)置最多嘗試次數(shù).
PHP實(shí)戰(zhàn)3.消費(fèi)隊(duì)列
PHP實(shí)戰(zhàn)這個(gè)時(shí)候任務(wù)只是入了隊(duì)列,但并沒(méi)有消費(fèi),執(zhí)行:
PHP實(shí)戰(zhàn)
php artisan queue:listen
PHP實(shí)戰(zhàn)這個(gè)命令,Laravel就開(kāi)始消費(fèi)隊(duì)列.
PHP實(shí)戰(zhàn)
PHP實(shí)戰(zhàn)可以看到這幾個(gè)任務(wù)以此被消費(fèi),再去Redis
看看有沒(méi)有實(shí)現(xiàn)預(yù)期要達(dá)到的效果,每個(gè)任務(wù)往一個(gè)List
類型的結(jié)構(gòu)寫(xiě)入數(shù)據(jù).
PHP實(shí)戰(zhàn)
PHP實(shí)戰(zhàn)這證明隊(duì)列任務(wù)消費(fèi)成功.
PHP實(shí)戰(zhàn)總結(jié)
PHP實(shí)戰(zhàn)本文的內(nèi)容到這就結(jié)束了,當(dāng)然,還有更多Laravel隊(duì)列的用法,可以請(qǐng)大家繼續(xù)參考官方手冊(cè).希望本文的內(nèi)容對(duì)大家學(xué)習(xí)Laravel有所幫助.
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/4819.html