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