国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Laravel 寫個 Queue 怎么這么難

RebeccaZhong / 1508人閱讀

摘要:可沒有這個命令,不過也很方便,默認會有一個已經寫好了,拷貝一份改個名字即可。如果使用框架,那么直接這么寫會報錯。原因在于的基類中并沒有使用這個,而是直接使用中的方法。

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

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

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

配置 添加 Redis 包

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

database.php

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

根據這個默認連接中需要的配置項,編輯 .env 配置文件,將其中的 REDIS_HOSTREDIS_PASSWORDREDIS_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: AppJobsDemo
[2017-11-07 02:12:47] Processed:  AppJobsDemo

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

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 配置 queuedefault 改為 {default},這樣做的效果就是隊列的名稱可以從運行的時候動態拿到,而不是寫死的。

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

原因在于 Lumen 的 Job 基類中并沒有使用 IlluminateFoundationBusDispatchable 這個 trait,而是直接使用 IlluminateBusQueueable 中的 onQueue() 方法。

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

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

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

php artisan queue:work --queue=emails

這里指定的隊列名 emails 和 dispatch 時指定的隊列名保持一致即可。

參考鏈接

Laravel 官方文檔

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26253.html

相關文章

  • 獻給虛擬主機 Laravel 4 用戶: 全功能 MySQL 隊列驅動器 L4mysqlqueue

    摘要:幾小時前剛剛發布的為隊列功能提供了官方原生的驅動器,完全取代了本軟件包的功能。不過這也并不意味著就是虛擬主機沒戲,必須云主機起跳的小網站殺手。性能確實低下受制于,絕對禁止用于大數量高密度任務的場合。虛擬主機肯定不會提供。 幾小時前剛剛發布的 Larevel 5.0 為隊列功能提供了官方原生的database驅動器,完全取代了本軟件包的功能。 對于Laravel 5及以上版本,本文的內...

    missonce 評論0 收藏0
  • 寫個博客程序,基于Laravel5.1開發

    摘要:話說也是換過好多程序,等都有嘗試過。更像是一個小型,內容型網站的瑞士軍刀。之所以不用它就是想換個程序。其實作為博客很不錯的編輯器,速度快,輕量。但不安分的我決定還是自己寫一個吧。權限管理緩存等還沒有完善,感受就是自己就是青銅五的渣渣水平。 話說也是換過好多程序,WordPress、HEXO、Typecho等都有嘗試過。WordPress更像是一個小型CMS,內容型網站的瑞士軍刀。之所以...

    springDevBird 評論0 收藏0
  • 為什么 Laravel 會重復執行同一個隊列任務?

    摘要:把因執行超時的隊列從集合重新到當前執行的隊列中。從要執行的隊列中取任務可以看到在取要執行的隊列的時候,同時會放一份到一個有序集合中,并使用過期時間戳作為分值。 (原文鏈接:https://blog.tanteng.me/2017/...) 在 Laravel 中使用 Redis 處理隊列任務,框架提供的功能非常強大,但是最近遇到一個問題,就是發現一個任務被多次執行,這是為什么呢? 先說...

    vboy1010 評論0 收藏0
  • Laravel 隊列服務

    摘要:按照配置文件注冊一個默認連接方式在此使用注冊隊列各種命令隊列連接重啟等。上面任務進入隊列的整個流程就明白了。 showImg(https://segmentfault.com/img/bVFvpd?w=980&h=274); 看完文檔 后總想知道是怎么樣一個開始,又是怎樣的一個結束!圖片來源 QueueServiceProvider Laravel 各種服務的注冊大多都是通過各種 Se...

    Caizhenhao 評論0 收藏0
  • 剖析Laravel隊列系統--初探

    摘要:配有內置的隊列系統,可幫助您在后臺運行任務,并通過簡單的來配置系統在不同情況下起作用。您可以在中管理隊列配置,默認情況下它有使用不同隊列驅動的幾個連接,您可以看到項目中可以有多個隊列連接,也可以使用多個隊列驅動程序。 原文鏈接https://divinglaravel.com/queue-system/before-the-dive Laravel receives a request...

    pubdreamcc 評論0 收藏0

發表評論

0條評論

RebeccaZhong

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<