成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Laravel 寫個(gè) Queue 怎么這么難

RebeccaZhong / 1510人閱讀

摘要:可沒有這個(gè)命令,不過也很方便,默認(rèn)會(huì)有一個(gè)已經(jīng)寫好了,拷貝一份改個(gè)名字即可。如果使用框架,那么直接這么寫會(huì)報(bào)錯(cuò)。原因在于的基類中并沒有使用這個(gè),而是直接使用中的方法。

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

下面是我的一個(gè)簡(jiǎn)單 Demo,僅僅使用了隊(duì)列的最基本操作,偏高級(jí)的操作需要再去好好時(shí)間一番 :)

和我一樣入門 Laravel 的隊(duì)列有些困難的同學(xué)可以交流一下。

配置 添加 Redis 包

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

database.php

database.php 配置文件中對(duì) redis 數(shù)據(jù)庫(kù)部分進(jìn)行配置,默認(rèn)有一個(gè) default 連接,就用這個(gè)好了:)

根據(jù)這個(gè)默認(rèn)連接中需要的配置項(xiàng),編輯 .env 配置文件,將其中的 REDIS_HOST、REDIS_PASSWORD、REDIS_PORT 填寫成自己服務(wù)器中 Redis 的相應(yīng)值。

queue.php

首先需要去 .env 中配置 QUEUE_DRIVER,因?yàn)楝F(xiàn)在打算用 Redis,所以配置成 redis。

接著配置 queue.php 里 connections 部分的 redis 連接,其中 connection 對(duì)應(yīng)的值就是 database.php 中 redis 的那個(gè) default 連接。

任務(wù)類

接下來(lái)就是寫實(shí)際的操作類了,Laravel 提供了 artisan 命令簡(jiǎn)化創(chuàng)建任務(wù)類:

php artisan make:job Demo

app 目錄下會(huì)生成 Jobs 目錄,里面已經(jīng)有了 Demo.php 任務(wù)類。

Lumen 可沒有這個(gè) artisan 命令,不過也很方便,默認(rèn)會(huì)有一個(gè) ExampleJob.php 已經(jīng)寫好了,拷貝一份改個(gè)名字即可。

先寫個(gè)簡(jiǎn)單的日志輸出測(cè)試一下好了,在 handle 方法中:

Log::info("Hello, queue");
發(fā)放任務(wù)

現(xiàn)在寫個(gè)入口函數(shù),推送任務(wù)到隊(duì)列中。使用輔助函數(shù) dispatch()

Laravel 中使用如下方式:

Demo::dispatch();

Lumen 中使用如下方式:

dispatch(new Demo);
開啟隊(duì)列

順利的話,這是最后一步了。命令行中執(zhí)行:

php artisan queue:listen --queue=default

它會(huì)監(jiān)聽隊(duì)列,并輸出簡(jiǎn)單的執(zhí)行情況,比如:

[2017-11-07 02:12:47] Processing: AppJobsDemo
[2017-11-07 02:12:47] Processed:  AppJobsDemo

沒啥問題后就可以讓這個(gè)隊(duì)列腳本執(zhí)行在后臺(tái):

php artisan queue:work --daemon --quiet --queue=default 1>> /dev/null 2>&1 &

進(jìn)階一下 :)

推送到隊(duì)列中時(shí),一般會(huì)有傳參的需求,那這里怎么傳呢?

參數(shù)傳遞 傳入

在入口函數(shù)中傳入?yún)?shù)方式如下:

Laravel 中使用如下方式:

$param = "Stephen";
Demo::dispatch($param);

Lumen 中使用如下方式:

$param = "Stephen";
dispatch(new Demo($param));
接收

在任務(wù)類中接收參數(shù)方式如下:

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);
}

初次嘗試到此為止,還有許多高級(jí)用法,比如延遲分發(fā)、錯(cuò)誤處理、優(yōu)先級(jí)、失敗處理等,后續(xù)會(huì)繼續(xù)寫 :)

多隊(duì)列

這是一個(gè)必然需要考慮到的問題,我不可能將所有任務(wù)都放在一個(gè)叫 default 的隊(duì)列中,這樣不容易對(duì)隊(duì)列進(jìn)行管理。

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

Demo::dispatch()->onQueue("emails");

不對(duì)啊,我好像沒有定義過這個(gè)叫 emails 的 queue。嗯,自然需要做出一點(diǎn)改動(dòng),在 queue.php 配置文件中的 redis 配置 queuedefault 改為 {default},這樣做的效果就是隊(duì)列的名稱可以從運(yùn)行的時(shí)候動(dòng)態(tài)拿到,而不是寫死的。

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

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

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

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

當(dāng)我們?cè)陂_啟隊(duì)列的時(shí)候:

php artisan queue:work --queue=emails

這里指定的隊(duì)列名 emails 和 dispatch 時(shí)指定的隊(duì)列名保持一致即可。

參考鏈接

Laravel 官方文檔

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26253.html

相關(guān)文章

  • 獻(xiàn)給虛擬主機(jī) Laravel 4 用戶: 全功能 MySQL 隊(duì)列驅(qū)動(dòng)器 L4mysqlqueue

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

    missonce 評(píng)論0 收藏0
  • 寫個(gè)博客程序,基于Laravel5.1開發(fā)

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

    springDevBird 評(píng)論0 收藏0
  • 為什么 Laravel 會(huì)重復(fù)執(zhí)行同一個(gè)隊(duì)列任務(wù)?

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

    vboy1010 評(píng)論0 收藏0
  • Laravel 隊(duì)列服務(wù)

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

    Caizhenhao 評(píng)論0 收藏0
  • 剖析Laravel隊(duì)列系統(tǒng)--初探

    摘要:配有內(nèi)置的隊(duì)列系統(tǒng),可幫助您在后臺(tái)運(yùn)行任務(wù),并通過簡(jiǎn)單的來(lái)配置系統(tǒng)在不同情況下起作用。您可以在中管理隊(duì)列配置,默認(rèn)情況下它有使用不同隊(duì)列驅(qū)動(dòng)的幾個(gè)連接,您可以看到項(xiàng)目中可以有多個(gè)隊(duì)列連接,也可以使用多個(gè)隊(duì)列驅(qū)動(dòng)程序。 原文鏈接https://divinglaravel.com/queue-system/before-the-dive Laravel receives a request...

    pubdreamcc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<