1. 程式人生 > >Laravel 5.5 Redis 佇列基本使用指南

Laravel 5.5 Redis 佇列基本使用指南

儀表盤【適用於 Windows

儀表盤就是 Horizon 咯

安裝

composer require laravel/horizon

配置

釋出相關檔案(包含配置等)

php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"

開始使用

連線/驅動

根據 config/queue.php 檔案,我們瞭解到驅動的配置在專案根目錄 .env 檔案內

開啟 .env 檔案,可將 QUEUE_DRIVER 設定為 QUEUE_DRIVER=redis,其下方為 Redis 連線基本配置

# 連線地址
REDIS_HOST=127.0.0.1
# 連線密碼
REDIS_PASSWORD=
# 連線埠
REDIS_PORT=6379

config/database.php 中最下方,我們可以看到 Redis 的預設配置,建議將 database 部分修改為:

'database' => env('REDIS_DB_SELECT', 0)

然後在 .env 檔案的 Redis 連線部分下新增一行,Like this。(這樣我們可以直接指定其它的 DB)

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=
REDIS_PORT=6379
REDIS_DB_SELECT=0

差點忘了,Redis 需要安裝依賴

composer require predis/predis

建立任務類

專案根目錄執行

php artisan make:job BaseJob

然後在 app\Jobs 目錄下得到 BaseJob.php 檔案

其中 handle() 方法在佇列任務執行觸發

新增任務到佇列

我們在一個測試用的控制器裡面寫一個 queue() 方法。

對於測試控制器,路由部分我是這麼玩兒的

  1. app\Http\Controllers 下建立 TestController 控制器
  2. routes\web.php 內新增
    Route::any('/test/{action?}', function ($action = '') {
        return App::make("App\\Http\\Controllers\\TestController")->
    $action(); });
    這樣就可以直接訪問 localhost/test/方法名,如果按照我的方法就是這樣的:localhost/test/queue

我們繼續完善這個方法:

public function queue() {
	// 可以瞧瞧返回值,記得 use App\Jobs\BaseJob;
	var_dump(BaseJob::dispatch());
}

切換到 app\Jobs\BaseJob.php 檔案,在 handle() 方法裡面新增一點輸出內容:

public function handle() {
    echo "job executed\n";
    $this->delete();
}

至此一個簡單的佇列就完成了,接下來讓我們執行它。

釋出任務、執行任務

我們直接請求 http://localhost/test/queue【地址自己替換一下】,將任務釋出到 Redis 裡面,頁面上返回結果如下:

object(Illuminate\Foundation\Bus\PendingDispatch)[467]
  protected 'job' => 
    object(App\Jobs\BaseJob)[463]
      public 'tries' => int 3
      public 'timeout' => int 60
      private 'type' => null
      private 'data' => 
        array (size=0)
          empty
      protected 'job' => null
      public 'connection' => null
      public 'queue' => null
      public 'chainConnection' => null
      public 'chainQueue' => null
      public 'delay' => null
      public 'chained' => 
        array (size=0)
          empty

需要了解的是,這個任務我們並沒有指定佇列名稱,所以它使用的是預設佇列名稱 default,我們通過一些 Redis GUI 軟體可以看到任務詳情。

當然這不重要,Redis 裡面的資料表示任務已經新增到佇列中了,接下來只需要執行這個任務就行。在專案根目錄戳如下命令:

# --once 表示執行一次,如果不新增 --once 引數,該命令會持續監聽佇列。如需終止,請按 Ctrl+C/control+C
php artisan queue:work --once

命令列會返回如下內容:

[2018-10-25 18:18:32] Processing: App\Jobs\BaseJob
job executed
[2018-10-25 18:18:32] Processed:  App\Jobs\BaseJob

至此一個簡單的佇列任務新增、釋出、執行就完成了。

更多使用姿勢

傳遞自定義資料

我們將 queue() 方法改成如下內容:

var_dump(BaseJob::dispatch(['name' => 'Max Sky', 'gender' => 1])
	->onQueue('MyQueue'));

此處我們在 dispatch 方法內放入了一個數組,該陣列在任務執行時可得到並使用;onQueue 方法指定了一個佇列名稱。

回到 BaseJob.php,調整建構函式如下:

private $data;

public function __construct($data = []) {
    $this->data = $data;
}

修改 handle() 方法如下:

public function handle() {
    print_r($this->data);
    $this->delete();
}

結果已經有了變化:

object(Illuminate\Foundation\Bus\PendingDispatch)[467]
  protected 'job' => 
    object(App\Jobs\BaseJob)[463]
      public 'tries' => int 3
      public 'timeout' => int 60
      private 'type' => null
      private 'data' => 
        array (size=2)
          'name' => string 'Max Sky' (length=7)
          'gender' => int 1
      protected 'job' => null
      public 'connection' => null
      public 'queue' => string 'MyQueue' (length=7)
      public 'chainConnection' => null
      public 'chainQueue' => null
      public 'delay' => null
      public 'chained' => 
        array (size=0)
          empty

佇列名稱和自定義資料都顯示出來了。

Redis 中有了新的佇列名稱 Key

Queue

Value 部分看起來是這樣的:

{
	"displayName": "App\\Jobs\\BaseJob",
	"job": "Illuminate\\Queue\\[email protected]",
	"maxTries": 3,
	"timeout": 60,
	"timeoutAt": null,
	"data": {
		"commandName": "App\\Jobs\\BaseJob",
		"command": "O:17:\"App\\Jobs\\BaseJob\":11:{s:5:\"tries\";i:3;s:7:\"timeout\";i:60;s:23:\"\u0000App\\Jobs\\BaseJob\u0000type\";N;s:23:\"\u0000App\\Jobs\\BaseJob\u0000data\";a:2:{s:4:\"name\";s:7:\"Max Sky\";s:6:\"gender\";i:1;}s:6:\"\u0000*\u0000job\";N;s:10:\"connection\";N;s:5:\"queue\";s:7:\"MyQueue\";s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:5:\"delay\";N;s:7:\"chained\";a:0:{}}"
	},
	"id": "1",
	"attempts": 0,
	"type": "job",
	"tags": [],
	"pushedAt": 1540464437.013529
}

然後我們再試試執行這個任務:

php artisan queue:work --once

咦?什麼都沒有發生。。。因為我們指定了佇列名稱,所以在執行的時候也必需指定:

php artisan queue:work --once --queue=MyQueue

返回結果如下,可以發現自定義的資料被傳遞進來:

[2018-10-25 18:53:08] Processing: App\Jobs\BaseJob
Array
(
    [name] => Max Sky
    [gender] => 1
)
[2018-10-25 18:53:08] Processed:  App\Jobs\BaseJob

延時任務

在某些情況下我們需要延時執行一些任務,delay 方法可以很好的協助我們完成這個操作。

這次我們先執行任務監聽命令,去掉 --once 引數:

php artisan queue:work --queue=MyQueue

然後修改 queue 方法如下:

public function queue() {
    var_dump(BaseJob::dispatch(['name' => 'Max Sky', 'gender' => 1])
        ->onQueue('MyQueue')
        // 此處使用了 Laravel 內建的 Carbon 庫,Carbon 是一個優秀的時間工具類
        // Carbon::now() 表示獲取當前時間;addSecond 表示在當前時間上增加 10 秒
        // 意思就是延時 10s 後執行任務
        ->delay(Carbon::now()->addSecond(10)));
}

接著重新整理網頁,結果如下:

object(Illuminate\Foundation\Bus\PendingDispatch)[467]
  protected 'job' => 
    object(App\Jobs\BaseJob)[463]
      public 'tries' => int 3
      public 'timeout' => int 60
      private 'type' => null
      private 'data' => 
        array (size=2)
          'name' => string 'Max Sky' (length=7)
          'gender' => int 1
      protected 'job' => null
      public 'connection' => null
      public 'queue' => string 'MyQueue' (length=7)
      public 'chainConnection' => null
      public 'chainQueue' => null
      public 'delay' => 
        object(Carbon\Carbon)[469]
          public 'date' => string '2018-10-25 19:05:32.647479' (length=26)
          public 'timezone_type' => int 3
          public 'timezone' => string 'PRC' (length=3)
      public 'chained' => 
        array (size=0)
          empty

趕緊回到命令列,等待 10s 後命令行有了結果【小誤差請忽略。。。】:

[2018-10-25 19:05:34] Processing: App\Jobs\BaseJob
Array
(
    [name] => Max Sky
    [gender] => 1
)
[2018-10-25 19:05:34] Processed:  App\Jobs\BaseJob

使用儀表盤

如果已安裝 laravel/horizon 併發布了配置檔案,我們可以利用儀表盤來管理任務。

編輯 config/horizon.php,在最下方的 environments 中,將 productionlocal 內的 queue 分別加上我們的自定義佇列名稱。

結果如下:

'environments' => [
    'production' => [
        'supervisor-1' => [
            'connection' => 'redis',
            'queue' => ['default', 'MyQueue'], // 此處新增佇列名稱
            'balance' => 'auto',
            'processes' => 10,
            'tries' => 3,
        ],
    ],

    'local' => [
        'supervisor-1' => [
            'connection' => 'redis',
            'queue' => ['default', 'MyQueue'], // 此處新增佇列名稱
            'balance' => 'auto',
            'processes' => 3,
            'tries' => 3,
        ],
    ],
],

然後我們直接執行如下命令就可以監聽佇列任務,並通過儀表盤頁面檢視任務資訊了:
【執行如下命令後,可替代之前的佇列命令,意味著無需再執行 php artisan queue:work --MyQueue

php artisan horizon

成功後命令行返回 Horizon started successfully.

左邊可以檢視最近的任務、失敗的任務等相關資訊。

更多

本文章對 Laravel 5.5 中的佇列使用做了比較簡單的描述,更多資訊包括優先順序、Supervisor 使用、失敗任務處理、重試次數等參考文件翻譯:佇列 | 《Laravel 5.5 中文文件》 | PHP / Laravel 社群文件

相關推薦

Laravel 5.5 Redis 佇列基本使用指南

儀表盤【不適用於 Windows】 儀表盤就是 Horizon 咯 安裝 composer require laravel/horizon 配置 釋出相關檔案(包含配置等) php artisan vendor:publish --provider="La

Laravel 5.5 Redis

Redis // 與 Redis 互動 $user = Redis::get('user:profile:'.$id); Redis::set('name', 'Taylor'); $values = Redis::lrange('names', 5, 10);

Redis 基礎知識(5種資料型別基本操作)

1、字串 set key1value1  //value1不僅可以是字串,也可以是整數或者浮點數。 get key1                     //獲取值 del key1              //刪除值 既然value1可以為數值型,因此可以對key1

Python學習筆記5 【轉載】基本矩陣運算_20170618

ros class 簡單 lba spa 使用 常見 port 模塊 需要 numpy 庫支持 保存鏈接 http://www.cnblogs.com/chamie/p/4870078.html 1.numpy的導入和使用 from numpy import *;

laravel框架 5.4 關於驗證和添加存在的bug

laravel框架 5.4 關於驗證和添加存在的bug今天本地測試添加用戶沒有問題。提交到服務器就報錯 sql語句找不到User.user_name字段;後來請教了一位大神,他告訴我 首先匹配服務器環境最好一至,我再執行驗證的時候有一個有個查詢的過程也就是驗證用戶唯一性的unique方法,這個方法是有參數的!

laravel框架 5.4自定義報錯頁面設置

laravel框架 5.4自定義報錯頁面設置在開發中遇到了如果此連接是正確的訪問地址http://localhost/cky/ckyweb/public/admin/userlist?page=2那麽 我在此連接的後面隨便加一下字符就會出現報錯信息在網站上線後是不允許這麽做的,所以結合laravel框架自帶的

CentOS 6 ElasticSearch 5.5.x 安裝指南

you 不支持 指南 文件 pri 索引 local arch echo 背景介紹 最新穩定版的ES 5.5.x版本對系統環境要求比較苛刻,如果不滿足的話,是無法正常啟動的。大家可以在ElasticSearch入門學習到如何安裝ES實例,這裏呢,主要向大家介紹如何解決ES在

laravel 5.5 oauth2.0 跨域問題解決方案

title apach war laravel jsonp 另一個 over gin strong 一、laravel-Cors 安裝 在終端執行安裝命令如下: composer require barryvdh/laravel-cors

結合 Laravel 5.5 + vue 2.5 開發的博客

前段時間 image vue 5.5 imageview git -type ads file 此博客是基於laravel 5.5和vue 2.5開發。後臺用的是element-ui。 網站:https://overxue.com 源碼:https://github.co

window下php5.5安裝redis擴展

php .net wamp image 學習 linu ima 很多 linux下 redis是現在比較流行的noSQL,主流大型網站都用的比較多,很多同學不知道怎麽安裝,這裏介紹在windows下面安裝以及擴展,提供學習使用,實際使用環境多在Linux下。 1.phpin

HTML 5與CSS 3權威指南(第2版·上冊) 中文pdf掃描版?

第8章 html5 信息 bubuko jpg 拖放 一個 本地存儲 其他 HTML5與CSS3權威指南(第2版·上冊)已經成為HTML 5與CSS 3圖書領域的一個標桿,被讀者譽為“系統學習HTML 5與CSS 3技術的最佳指導參考書之一”和“Web前端工程師案頭必備圖書

laravel 5.5 安裝

laravel fastcgi token stc pos pen ctu 創建 error PHP要求 PHP> = 7.0.0 OpenSSL PHP擴展 PDO PHP擴展 Mbstring PHP擴展 Tokenizer PHP擴展 XML P

laravel 5.5 倉庫模式 文件之間接口與實現操作

使用方法 行數 實現 pan 註冊 AR reg php 需要 倉庫模式 最直接的意思就是: Eloquent數據(數據庫)查詢 方便快捷,簡單明了。自己怎麽寫的,就怎麽去調用,完全ok~ 本質意思: 倉庫就像是業務內部的數據對象集合,負責協調業務和數據映射層之間的關

Laravel 5.5 FormRequest 自定義表單請求驗證類

根目錄 use his extends 數據 不一致 不能 登錄模塊 能夠 1、把表單驗證邏輯寫在Controller中,這是最基礎的方法,但是不好維護,如: 1 namespace App\Http\Controllers\Admin; 2 3 use Illu

angular 1.5.X 防入坑指南

使用 註意 bsp -o lar option 入坑指南 col 5.x 1.ne-repeat使用註意事項 在設置<select>類控件“ng-repeat”屬性時,"as"前部分對應value值,用於選中時獲取,"as"後面部分對應元素的text值,用

5redis常用操作(數據類型+鍵值+服務+安全)

管理 4.0 empty 目錄 打開 mman linux process tables [toc] 5種redis常用數據類型操作 一、Redis常用操作 (string, list) 1.1 如果一個key設置兩個不同的值,第二個值會覆蓋第一個值。 [root@xavi

[ Laravel 5.5 文檔 ] 數據庫操作 —— 在 Laravel 中輕松實現分頁功能

pub thp erp 不能 res bootstrap 自己的 post 自動 ? 簡介 在其他框架中,分頁是件非常痛苦的事,Laravel 讓這件事變得簡單易於上手。Laravel 的分頁器與查詢構建器和 Eloquent ORM 集成在一起,並開箱提供方便的、易於使用

從零開始搭建linux下laravel 5.5所需環境(三)

一個 技術 useradd color ram end php localhost aca 好的,我們已經安裝好了nginx+mysql+php了,打開[ Laravel 5.5 文檔 ] 快速入門 —— 安裝配置篇 我們看到這裏需要安裝Composer,好的,我們現在就

Laravel 教程 - Web 開發實戰入門 ( Laravel 5.5 )購買鏈接

info 實戰 ima inf 教程 分享圖片 入門 bing mage ? Laravel 教程 - Web 開發實戰入門 ( Laravel 5.5 )購買鏈接: 推薦給你高品質的實戰課程 https://laravel-china.org/courses?rf=

laravel 項目本地版本為5.5,線上mysql 為5.7.21版本,執行嚴格模式

多說 沒有 lar mysql 圖片 sin 分享 png 16px 看到網上很多說修改 但是在mysql 5.7中沒有這個參數設置,故放棄; 結合本項目sina_id 10位超過int的最大範圍4294967295,所以報錯,修改為bigint 即可。 la