????今天體驗了 Laravel 框架中的隊列功能向拆,也遇到了一些問題亚茬,接下來記錄一下使用的步驟,使用一個小小的案例進行說明浓恳。我使用的 Laravel5.5 框架刹缝,隊列驅動為 Redis。
- 安裝 Predis 擴展
$ composer require predis/predis
- 配置 Redis
打開 config/database.php 文件颈将,找到 Redis 的配置信息:
'redis' => [
'client' => 'predis',
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
],
'session' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 1,
],
'queue' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 2,
],
],
這里我配置了多個連接梢夯,保留 default 配置,由于使用 Redis 存儲 Session晴圾,所以新建了一個名為 session 的配置颂砸,對應的數據庫為1。然后新建 queue 配置用于隊列死姚,對應的數據庫為2人乓。這樣配置的好處是各個功能的數據可以分開存放,運行和維護的時候會更加方便都毒。
- 配置 .env 中的信息
打開 .env 文件色罚,默認會有redis連接和隊列的配置信息
QUEUE_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
這里講 QUEUE_DRIVER 改為 Redis,下面的 Reids 連接信息根據自己的情況進行填寫账劲。
- 新建一個隊列 Job
使用 Laravel 的 Artisan 命令進行創(chuàng)建
$ php artisan make:job GoodsInfoToLog (這里根據自己的需要進行修改)
執(zhí)行完成后會在 app 目錄中出現 Job 目錄和 GoodsInfoToLog.php 文件:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class GoodsInfoToLog implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct()
{
}
public function handle()
{
}
}
- 演示隊列使用
在這里我將演示將商品信息使用隊列系統(tǒng)記錄到日志中:
修改 GoodsInfoToLog.php 文件:
<?php
namespace App\Jobs;
use App\Models\Goods;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Log;
class GoodsInfoToLog implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $goods;
//將商品模型類進行依賴注入
public function __construct(Goods $goods)
{
$this->goods = $goods;
}
//編寫隊列所執(zhí)行任務的業(yè)務邏輯戳护,下面是將商品信息記錄到log中
public function handle()
{
Log::info(['id' => $this->goods->id, 'title' => $this->goods->title, 'price' => $this->goods->price]);
}
}
打開路由文件 web.php
進行路由注冊金抡,將這些任務記錄到隊列中:
Route::get('goodsInfo', function () {
$goods = \App\Models\Goods::all();
foreach ($goods as $item) {
\App\Jobs\GoodsInfoToLog ::dispatch($item);
}
});
打開瀏覽器,輸入 example.com/goodsInfo
姑尺,回車竟终,這樣就會將任務記錄到隊列中。
打開命令行工具切蟋,進入到項目根目錄,運行隊列任務:
#執(zhí)行一條隊列任務
$ php artisan queue:work --once
執(zhí)行完畢榆芦,打開日志柄粹,查看是否有內容輸出:
[2019-01-08 23:22:14] local.INFO: array (
'id' => 1,
'title' => '感冒靈顆粒',
'price' => '10.50',
)
ok,正常輸出匆绣。繼續(xù)執(zhí)行則會繼續(xù)記錄驻右,直到隊列任務執(zhí)行完畢;
如果想一次全部執(zhí)行崎淳,可以使用:
$ php artisan queue:work
這樣就會一次全部執(zhí)行堪夭,查看 Log 是否正常輸出。
6.安裝 Horizon 擴展
Horizon 為 Laravel 官方發(fā)布的隊列監(jiān)控面板拣凹,他可以更加直觀的展示隊列的運行狀況森爽。執(zhí)行以下命令進行安裝:
$ composer require laravel/horizon
發(fā)布配置文件:
$ php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
執(zhí)行完成會在 config 目錄創(chuàng)建 horizon.php 文件作為配置文件
打開 web.php路由文件,填入 horizon 的路由:
\Laravel\Horizon\Horizon::auth(function ($request) {
//此處可進權限判斷嚣镜,測試情況下直徑 return true 即可
return true;
});
使用瀏覽器打開 example.com/horizon爬迟,就可以看到對應的界面:
注意狀態(tài)為關閉,接下來啟動該服務菊匿,在命令行中執(zhí)行:
$ php artisan horizon
狀態(tài)變?yōu)橐褑樱?br> 有了 Horizon付呕,我們的隊列任務創(chuàng)建后會自動執(zhí)行,更加方便跌捆,并且可以展示更多的隊列執(zhí)行的數據徽职。
ok!這里只是講述了最基本的用法佩厚,更詳細的內容可以去查看官方文檔姆钉。
文章同步發(fā)布在我的個人博客中,傳送門Hesunfly Blog