溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Queue怎么在Laravel中使用

發(fā)布時間:2021-03-29 17:27:10 來源:億速云 閱讀:182 作者:Leah 欄目:開發(fā)技術

本篇文章給大家分享的是有關Queue怎么在Laravel中使用,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

配置

添加 Redis

在 composer.json 中 require 部分加入 "predis/predis": "~1.0",,然后 composer up 更新一下即可。

database.php

在 database.php 配置文件中對 redis 數(shù)據庫部分進行配置,默認有一個 default 連接,就用這個好了:)

根據這個默認連接中需要的配置項,編輯 .env 配置文件,將其中的 REDIS_HOST、REDIS_PASSWORD、REDIS_PORT 填寫成自己服務器中 Redis 的相應值。

queue.php

首先需要去 .env 中配置 QUEUE_DRIVER,因為現(xiàn)在打算用 Redis,所以配置成 redis。

接著配置 queue.php 里 connections 部分的 redis 連接,其中 connection 對應的值就是 database.php 中 redis 的那個 default 連接。

任務類

接下來就是寫實際的操作類了,Laravel 提供了 artisan 命令簡化創(chuàng)建任務類:

php artisan make:job Demo

在 app 目錄下會生成 Jobs 目錄,里面已經有了 Demo.php 任務類。

Lumen 可沒有這個 artisan 命令,不過也很方便,默認會有一個 ExampleJob.php 已經寫好了,拷貝一份改個名字即可。
先寫個簡單的日志輸出測試一下好了,在 handle 方法中:

Log::info('Hello, queue');

發(fā)放任務

現(xiàn)在寫個入口函數(shù),推送任務到隊列中。使用輔助函數(shù) dispatch():

Laravel 中使用如下方式:

Demo::dispatch();

Lumen 中使用如下方式:

dispatch(new Demo);

開啟隊列

順利的話,這是最后一步了。命令行中執(zhí)行:

php artisan queue:listen --queue=default

它會監(jiān)聽隊列,并輸出簡單的執(zhí)行情況,比如:

[2017-11-07 02:12:47] Processing: App\Jobs\Demo
[2017-11-07 02:12:47] Processed: App\Jobs\Demo

沒啥問題后就可以讓這個隊列腳本執(zhí)行在后臺:

php artisan queue:work --daemon --quiet --queue=default 1>> /dev/null 2>&1

進階一下 :)

推送到隊列中時,一般會有傳參的需求,那這里怎么傳呢?

參數(shù)傳遞

傳入

在入口函數(shù)中傳入參數(shù)方式如下:

Laravel 中使用如下方式:

$param = 'Stephen';
Demo::dispatch($param);

Lumen 中使用如下方式:

$param = 'Stephen';
dispatch(new Demo($param));

接收

在任務類中接收參數(shù)方式如下:

protected $param;
/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct($param)
{
  $this->param = $param;
}
/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
  Log::info('Hello, ' . $this->param);
}

初次嘗試到此為止,還有許多高級用法,比如延遲分發(fā)、錯誤處理、優(yōu)先級、失敗處理等,后續(xù)會繼續(xù)寫 :)

多隊列

這是一個必然需要考慮到的問題,我不可能將所有任務都放在一個叫 default 的隊列中,這樣不容易對隊列進行管理。

要指定不同的隊列,非常簡單,在 dispatch() 后緊接著跟上 onQueue() 方法即可:

Demo::dispatch()->onQueue('emails');

不對啊,我好像沒有定義過這個叫 emails 的 queue。嗯,自然需要做出一點改動,在 queue.php 配置文件中的 redis 配置 queue 從 default 改為 {default},這樣做的效果就是隊列的名稱可以從運行的時候動態(tài)拿到,而不是寫死的。

如果使用 Lumen 框架,那么直接這么寫會報錯:Call to a member function onQueue() on string。

原因在于 Lumen 的 Job 基類中并沒有使用 Illuminate\Foundation\Bus\Dispatchable 這個 trait,而是直接使用 Illuminate\Bus\Queueable 中的 onQueue() 方法。

那么現(xiàn)在就很清楚了,我們的 Job 類使用了 Illuminate\Bus\Queueable 這個 trait,所以需要在 Job 類上調用這個 onQueue() 方法。

$job = new XXXJob();
dispatch($job->onQueue('queue-name'));

當我們在開啟隊列的時候:

php artisan queue:work --queue=emails

以上就是Queue怎么在Laravel中使用,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI