首頁 後端開發 php教程 Laravel之Queue的使用

Laravel之Queue的使用

May 25, 2018 pm 01:48 PM
laravel queue 使用

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Laravel和CodeIgniter的最新版本對比 Laravel和CodeIgniter的最新版本對比 Jun 05, 2024 pm 05:29 PM

Laravel9和CodeIgniter4的最新版本提供了更新的功能和改進。 Laravel9採用MVC架構,提供資料庫遷移、驗證及模板引擎等功能。 CodeIgniter4採用HMVC架構,提供路由、ORM和快取。在性能方面,Laravel9的基於服務提供者設計模式和CodeIgniter4的輕量級框架使其具有出色的性能。在實際應用中,Laravel9適用於需要靈活性和強大功能的複雜項目,而CodeIgniter4適用於快速開發和小型應用程式。

Laravel 和 CodeIgniter 中資料處理能力的比較如何? Laravel 和 CodeIgniter 中資料處理能力的比較如何? Jun 01, 2024 pm 01:34 PM

比較Laravel和CodeIgniter的資料處理能力:ORM:Laravel使用EloquentORM,提供類別物件關係映射,而CodeIgniter使用ActiveRecord,將資料庫模型表示為PHP類別的子類別。查詢建構器:Laravel具有靈活的鍊式查詢API,而CodeIgniter的查詢建構器更簡單,基於陣列。資料驗證:Laravel提供了一個Validator類,支援自訂驗證規則,而CodeIgniter的驗證功能內建較少,需要手動編碼自訂規則。實戰案例:用戶註冊範例展示了Lar

Laravel 和 CodeIgniter 對於初學者來說哪一個比較友善? Laravel 和 CodeIgniter 對於初學者來說哪一個比較友善? Jun 05, 2024 pm 07:50 PM

對於初學者來說,CodeIgniter的學習曲線更平緩,功能較少,但涵蓋了基本需求。 Laravel提供了更廣泛的功能集,但學習曲線稍陡。在性能方面,Laravel和CodeIgniter都表現出色。 Laravel有更廣泛的文件和活躍的社群支持,而CodeIgniter更簡單、輕量級,具有強大的安全功能。在建立部落格應用程式的實戰案例中,Laravel的EloquentORM簡化了資料操作,而CodeIgniter需要更多的手動配置。

Laravel和CodeIgniter:哪種框架更適合大型專案? Laravel和CodeIgniter:哪種框架更適合大型專案? Jun 04, 2024 am 09:09 AM

在選擇大型專案框架時,Laravel和CodeIgniter各有優勢。 Laravel針對企業級應用程式而設計,提供模組化設計、相依性注入和強大的功能集。 CodeIgniter是一款輕量級框架,更適合小型到中型項目,強調速度和易用性。對於具有複雜需求和大量用戶的大型項目,Laravel的強大功能和可擴展性更為合適。而對於簡單專案或資源有限的情況下,CodeIgniter的輕量級和快速開發能力則較為理想。

什麼是Bitget Launchpool?如何使用Bitget Launchpool? 什麼是Bitget Launchpool?如何使用Bitget Launchpool? Jun 07, 2024 pm 12:06 PM

BitgetLaunchpool是一個為所有加密貨幣愛好者而設計的動態平台。 BitgetLaunchpool以其獨特的產品脫穎而出。在這裡,您可以質押您的代幣來解鎖更多獎勵,包括空投、高額回報,以及專屬早期參與者的豐厚獎金池。什麼是BitgetLaunchpool? BitgetLaunchpool是一個加密貨幣平台,可以透過使用者友善的條款和條件來質押和賺取代幣。透過在Launchpool中投入BGB或其他代幣,用戶有機會獲得免費空投、收益和參與豐厚的獎金池。質押資產的收益在T+1小時內計算,獎勵按

Laravel - Artisan 指令 Laravel - Artisan 指令 Aug 27, 2024 am 10:51 AM

Laravel - Artisan 指令 - Laravel 5.7 提供了處理和測試新指令的新方法。它包括測試 artisan 命令的新功能,下面提到了演示?

Laravel和CodeIgniter:哪種框架比較適合小型專案? Laravel和CodeIgniter:哪種框架比較適合小型專案? Jun 04, 2024 pm 05:29 PM

對於小型項目,Laravel適用於大型項目,需要強大的功能和安全性。 CodeIgniter適用於非常小的項目,需要輕量級和易用性。

Laravel 和 CodeIgniter 的模板引擎哪一個比較好? Laravel 和 CodeIgniter 的模板引擎哪一個比較好? Jun 03, 2024 am 11:30 AM

比較了Laravel的Blade和CodeIgniter的Twig模板引擎,根據專案需求和個人偏好進行選擇:Blade基於MVC語法,鼓勵良好程式碼組織和模板繼承。 Twig是第三方函式庫,提供靈活語法、強大過濾器、擴充支援和安全沙箱。

See all articles