濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Laravel中使用Queue的最基本操作教程

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

熱門(mén)標(biāo)簽:長(zhǎng)沙crm外呼系統(tǒng)業(yè)務(wù) 400電話(huà)申請(qǐng)方法收費(fèi) 專(zhuān)業(yè)電話(huà)機(jī)器人批發(fā)商 江蘇外呼電銷(xiāo)機(jī)器人報(bào)價(jià) 電話(huà)機(jī)器人危險(xiǎn)嗎 南寧高頻外呼回?fù)芟到y(tǒng)哪家好 離石地圖標(biāo)注 深圳外呼系統(tǒng)收費(fèi) 400電話(huà)辦理福州市

前言

laravel中的隊(duì)列服務(wù)跟其他隊(duì)列服務(wù)也沒(méi)有什么不同,都是最符合人類(lèi)思維的最簡(jiǎn)單最普遍的流程:有一個(gè)地方存放隊(duì)列信息,一個(gè)PHP進(jìn)程在運(yùn)行時(shí)將任務(wù)寫(xiě)入,另外一個(gè)PHP守護(hù)進(jìn)程輪詢(xún)隊(duì)列信息,將達(dá)到執(zhí)行要求的任務(wù)執(zhí)行并刪除。由于PHP是url驅(qū)動(dòng)的同步語(yǔ)言,本身是阻塞的,所以laravel提供一個(gè)守護(hù)進(jìn)程工具來(lái)查詢(xún)并執(zhí)行隊(duì)列信息也就不足為奇了。

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

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

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

配置

添加 Redis 包

在 composer.json 中 require 部分加入 "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 填寫(xiě)成自己服務(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)

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

php artisan make:job Demo

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

Lumen 可沒(méi)有這個(gè) artisan 命令,不過(guò)也很方便,默認(rèn)會(huì)有一個(gè) ExampleJob.php 已經(jīng)寫(xiě)好了,拷貝一份改個(gè)名字即可。
先寫(xiě)個(gè)簡(jiǎn)單的日志輸出測(cè)試一下好了,在 handle 方法中:

Log::info('Hello, queue');

發(fā)放任務(wù)

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

Laravel 中使用如下方式:

Demo::dispatch();

Lumen 中使用如下方式:

dispatch(new Demo);

開(kāi)啟隊(duì)列

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

php artisan queue:listen --queue=default

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

[2017-11-07 02:12:47] Processing: App\Jobs\Demo
[2017-11-07 02:12:47] Processed: App\Jobs\Demo

沒(méi)啥問(wèn)題后就可以讓這個(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ù)類(lèi)中接收參數(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ù)寫(xiě) :)

多隊(duì)列

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

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

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

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

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

原因在于 Lumen 的 Job 基類(lèi)中并沒(méi)有使用 Illuminate\Foundation\Bus\Dispatchable 這個(gè) trait,而是直接使用 Illuminate\Bus\Queueable 中的 onQueue() 方法。

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

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

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

php artisan queue:work --queue=emails

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

參考鏈接

Laravel 官方文檔

您可能感興趣的文章:
  • PHP的Laravel框架中使用消息隊(duì)列queue及異步隊(duì)列的方法
  • Laravel 4.2 中隊(duì)列服務(wù)(queue)使用感受

標(biāo)簽:濱州 曲靖 白酒營(yíng)銷(xiāo) 南昌 太原 興安盟 株洲 南京

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Laravel中使用Queue的最基本操作教程》,本文關(guān)鍵詞  Laravel,中,使用,Queue,的,最,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Laravel中使用Queue的最基本操作教程》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Laravel中使用Queue的最基本操作教程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    三河市| 夏邑县| 洮南市| 晋宁县| 民勤县| 扎囊县| 和平县| 兴和县| 城口县| 定安县| 阿巴嘎旗| 宁强县| 宜章县| 永年县| 珠海市| 新巴尔虎左旗| 扎鲁特旗| 桑日县| 梅州市| SHOW| 突泉县| 临泉县| 梁山县| 日照市| 淮阳县| 会东县| 景泰县| 铜陵市| 黑河市| 专栏| 宝清县| 游戏| 新蔡县| 青田县| 土默特左旗| 肥东县| 鹤庆县| 襄垣县| 汶川县| 大城县| 兴化市|