Laravel中使用Queue的最基本操作教程講解

來源:互聯網
上載者:User
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 時指定的隊列名保持一致即可。

總結

您可能感興趣的文章:

詳解Yaf架構PHPUnit整合測試方法講解

快速解決PHP調用Word組件DCOM許可權的問題講解

PHP擷取數組中指定的一列執行個體講解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.