Laravel之Queue的使用

*文
發布: 2023-03-18 17:12:01
原創
3561 人瀏覽過

Laravel隊列服務為各種不同的後台隊列提供統一的API,本文主要給大家介紹了Laravel中使用Queue的最基本操作教程,文中透過範例程式碼介紹的非常詳細。希望對大家有幫助。

前言

laravel中的隊列服務跟其他隊列服務也沒有什麼不同,都是最符合人類思維的最簡單、最普遍的流程:有一個地方存放隊列信息,一個PHP進程在運行時將任務寫入,另外一個PHP守護程序輪詢隊列信息,將達到執行要求的任務執行並刪除。由於PHP是url驅動的同步語言,本身是阻塞的,所以laravel提供一個守護程序工具來查詢並執行佇列資訊也就不足為奇了。

這兩天初次接觸 Laravel 的隊列,也是搞了好一會。 。 。一番折騰下來還是感慨對 Laravel 不得其門,文檔寫的相對簡單和概括,看源碼又有些力不從心(不過看源碼慢慢調試驗證還是最可靠的)。

下面是我的一個簡單Demo,僅僅使用了隊列的最基本操作,偏高級的操作需要再去好好時間一番:)

和我一樣入門Laravel 的隊列有些困難的同學可以交流一下。

配置

#新增Redis 套件

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

database.php

在database.php 設定檔中對redis 資料庫部分進行配置,預設有一個default 連接,就用這個好了: )

根據這個預設連線中所需的設定項,編輯.env 設定文件,將其中的REDIS_HOST、REDIS_PASSWORD、REDIS_PORT 填入自己伺服器中Redis 的對應值。

queue.php

首先需要去 .env 設定 QUEUE_DRIVER,因為現在打算用 Redis,所以要設定成 redis。

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

任務類別

接下來就是寫實際的操作類別了,Laravel 提供了artisan 指令簡化建立任務類別:

php artisan make:job Demo
登入後複製

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

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

Log::info('Hello, queue');
登入後複製

#發放任務

##現在寫個入口函數,推送任務到佇列。使用輔助函數dispatch():

Laravel 中使用以下方式:

Demo::dispatch();
登入後複製

Lumen 中使用如下方式:

dispatch(new Demo);
登入後複製

##開啟佇列
順利的話,這是最後一步了。在命令列中執行:

php artisan queue:listen --queue=default
登入後複製

它會監聽佇列,並且輸出簡單的執行情況,例如:

[2017-11-07 02:12:47] Processing: App\Jobs\Demo
[2017-11-07 02:12:47] Processed: App\Jobs\Demo
登入後複製

沒啥問題後就可以讓這個佇列腳本執行在後台:

php artisan queue:work --daemon --quiet --queue=default 1>> /dev/null 2>&1
登入後複製

進階一下:)

推到佇列中時,一般會有傳參的需求,那這裡怎麼傳呢?

參數傳遞
傳入


在入口函數中傳入參數方式如下:

Laravel 中使用以下方式:

$param = 'Stephen';
Demo::dispatch($param);
登入後複製

Lumen 中使用以下方式:

$param = 'Stephen';
dispatch(new Demo($param));
登入後複製

接收


在任務類別中接收參數方式如下:

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);
}
登入後複製

初次嘗試到此為止,還有許多高階用法,例如延遲分發、錯誤處理、優先順序、失敗處理等,後續會繼續寫:)

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

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

Demo::dispatch()->onQueue('emails');
登入後複製

不對啊,我好像沒有定義過這個叫emails 的queue。嗯,自然需要做一點改動,在queue.php 設定檔中的redis 設定queue 從default 改為{default},而這樣做的效果就是佇列的名稱可以從執行的時候動態拿到,而不是寫死的。

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

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

那麼現在就很清楚了,我們的 Job 類別使用了 Illuminate\Bus\Queueable 這個 trait,所以需要在 Job 類別上呼叫這個 onQueue() 方法。

$job = new XXXJob();
dispatch($job->onQueue('queue-name'));
登入後複製

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

php artisan queue:work --queue=emails
登入後複製

这里指定的队列名 emails 和 dispatch 时指定的队列名保持一致即可。

相关推荐:

学习Laravel5的Eloquent 关系

laravel5.5控制器传参顺序问题及解决方案

Laravel 5.5的可相应接口如何使用?

以上是Laravel之Queue的使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!