Laravel 隊列基礎使用

????今天體驗了 Laravel 框架中的隊列功能向拆,也遇到了一些問題亚茬,接下來記錄一下使用的步驟,使用一個小小的案例進行說明浓恳。我使用的 Laravel5.5 框架刹缝,隊列驅動為 Redis。

  1. 安裝 Predis 擴展
$ composer require predis/predis
  1. 配置 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人乓。這樣配置的好處是各個功能的數據可以分開存放,運行和維護的時候會更加方便都毒。

  1. 配置 .env 中的信息
    打開 .env 文件色罚,默認會有redis連接和隊列的配置信息
QUEUE_DRIVER=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

這里講 QUEUE_DRIVER 改為 Redis,下面的 Reids 連接信息根據自己的情況進行填寫账劲。

  1. 新建一個隊列 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()
    {
  
    }
}
  1. 演示隊列使用
    在這里我將演示將商品信息使用隊列系統(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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末可款,一起剝皮案震驚了整個濱河市育韩,隨后出現的幾起案子,更是在濱河造成了極大的恐慌闺鲸,老刑警劉巖筋讨,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異摸恍,居然都是意外死亡悉罕,警方通過查閱死者的電腦和手機赤屋,發(fā)現死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壁袄,“玉大人类早,你說我怎么就攤上這事∈嚷撸” “怎么了涩僻?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長栈顷。 經常有香客問我逆日,道長,這世上最難降的妖魔是什么萄凤? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任室抽,我火速辦了婚禮,結果婚禮上靡努,老公的妹妹穿的比我還像新娘坪圾。我一直安慰自己,他們只是感情好惑朦,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布兽泄。 她就那樣靜靜地躺著,像睡著了一般行嗤。 火紅的嫁衣襯著肌膚如雪已日。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天栅屏,我揣著相機與錄音飘千,去河邊找鬼。 笑死栈雳,一個胖子當著我的面吹牛护奈,可吹牛的內容都是我干的。 我是一名探鬼主播哥纫,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼霉旗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛀骇?” 一聲冷哼從身側響起厌秒,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎擅憔,沒想到半個月后鸵闪,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡暑诸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年蚌讼,在試婚紗的時候發(fā)現自己被綠了辟灰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡篡石,死狀恐怖芥喇,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情凰萨,我是刑警寧澤继控,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站沟蔑,受9級特大地震影響湿诊,放射性物質發(fā)生泄漏。R本人自食惡果不足惜瘦材,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仿畸。 院中可真熱鬧食棕,春花似錦、人聲如沸错沽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽千埃。三九已至憔儿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間放可,已是汗流浹背谒臼。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耀里,地道東北人蜈缤。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像冯挎,于是被迫代替她去往敵國和親底哥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348