最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Laravel 隊(duì)列使用的實(shí)現(xiàn)

 更新時(shí)間:2019年01月08日 09:19:57   作者:bbdlg  
這篇文章主要介紹了Laravel 隊(duì)列使用的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

1 環(huán)境

Laravel是一種類似ThinkPHP的php框架,封裝的諸多功能可以很方便的使用。隊(duì)列Queue便是其中之一。

Windows環(huán)境下,可使用PHPstorm作為L(zhǎng)aravel的集成開發(fā)環(huán)境IDE。

2 隊(duì)列

Laravel可配置多種隊(duì)列驅(qū)動(dòng),包括 "sync", "database", "beanstalkd", "sqs", "redis", "null"(具體參見app/config/queue.php)
其中sync為同步,database為使用數(shù)據(jù)庫,后面三種為第三方隊(duì)列服務(wù),最后一種為不使用隊(duì)列。

通過在 .env 中的 QUEUE_CONNECTION 選項(xiàng),來決定選擇何種驅(qū)動(dòng)。

如 QUEUE_CONNECTION=database 即為選擇數(shù)據(jù)庫驅(qū)動(dòng)隊(duì)列。

3 原理

所謂隊(duì)列,會(huì)有數(shù)據(jù)的生產(chǎn)者和消費(fèi)者之分。生產(chǎn)者向隊(duì)列中投遞數(shù)據(jù),消費(fèi)者從隊(duì)列中獲取數(shù)據(jù)。

比如向用戶發(fā)送郵件的場(chǎng)景:現(xiàn)在有10w封郵件需要發(fā)送,最簡(jiǎn)單的,我們需要有一個(gè)方法將郵件的收件人、內(nèi)容等,拆分成10w條任務(wù)放在隊(duì)列中,同時(shí)需要設(shè)置一個(gè)回調(diào)方法負(fù)責(zé)處理每條任務(wù)。當(dāng)隊(duì)列中有郵件發(fā)送任務(wù)時(shí),隊(duì)列會(huì)主動(dòng)調(diào)用回調(diào)方法,并傳遞任務(wù)詳情進(jìn)去?;卣{(diào)方法處理完成后,單條郵件即發(fā)送完畢。其他郵件依樣處理。

4 使用數(shù)據(jù)庫驅(qū)動(dòng)隊(duì)列

4.1 生成任務(wù)表

在終端下輸入

php artisan queue:table
php artisan migrate

在數(shù)據(jù)庫連接正常的情況下,會(huì)在數(shù)據(jù)庫中出現(xiàn)jobs表:

 [id] bigint 
 [queue] nvarchar(255) 
 [payload] nvarchar(max) 
 [attempts] tinyint 
 [reserved_at] int 
 [available_at] int 
 [created_at] int 

4.2 創(chuàng)建任務(wù)類

php artisan make:job SendEmail

在終端內(nèi)執(zhí)行上述命令,會(huì)自動(dòng)生成 app/Jobs/SendMail.php 文件

class SendMail implements ShouldQueue

在該文件的handle方法中,可以放置任務(wù)處理邏輯。

4.3 發(fā)送任務(wù)

在任意位置,均可像下面一樣調(diào)用 dispatch 發(fā)送任務(wù)

SendMail::dispatch($email);

4.4 驅(qū)動(dòng)隊(duì)列

完成上述步驟后,可以在數(shù)據(jù)庫中發(fā)現(xiàn)一條記錄(導(dǎo)出為insert SQL語句):

復(fù)制代碼 代碼如下:
INSERT INTO [jobs]([id], [queue], [payload], [attempts], [reserved_at], [available_at], [created_at]) VALUES (6, N'default', N'{"displayName":"App\\Jobs\\ProcessPodcast","job":"Illuminate\\Queue\\CallQueuedHandler@call","maxTries":null,"timeout":null,"timeoutAt":null,"data":{"commandName":"App\\Jobs\\ProcessPodcast","command":"O:23:\"App\\Jobs\\ProcessPodcast\":8:{s:29:\"\u0000App\\Jobs\\ProcessPodcast\u0000data\";s:6:\"111222\";s:6:\"\u0000*\u0000job\";N;s:10:\"connection\";N;s:5:\"queue\";N;s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:5:\"delay\";N;s:7:\"chained\";a:0:{}}"}}', 0, NULL, 1545980176, 1545980176);

此時(shí)任務(wù)已經(jīng)放置在數(shù)據(jù)庫內(nèi),只有將隊(duì)列運(yùn)行起來后,隊(duì)列才能主動(dòng)調(diào)用回調(diào)方法。

php artisan queue:work

在終端內(nèi)運(yùn)行上述命令即可。該命令還有諸多參數(shù),如deamon、tries等,可根據(jù)需要指定。

4.5 守護(hù)進(jìn)程

為了保證應(yīng)用服務(wù)的穩(wěn)定性,需要開啟守護(hù)進(jìn)程。

Linux下,一般使用 Supervisor ,Windows下使用 Forever

4.6 執(zhí)行失敗的處理

對(duì)于處理失敗的任務(wù),Laravel也提供的解決方案。通過運(yùn)行如下命令,即可創(chuàng)建表以記錄失敗任務(wù)。

php artisan queue:failed-table
php artisan migrate

在數(shù)據(jù)庫中即生成 failed_jobs :

 [id] bigint
 [connection] nvarchar(max)
 [queue] nvarchar(max) 
 [payload] nvarchar(max) 
 [exception] nvarchar(max) 
 [failed_at] datetime

導(dǎo)致任務(wù)失敗的 Exception 會(huì)被傳遞到 SendMail 的 failed 方法,因而你需要在SendMail中自行實(shí)現(xiàn)該方法,并做進(jìn)一步處理。

任務(wù)執(zhí)行失敗的原因有很多,如傳參錯(cuò)誤、嘗試次數(shù)超過限制、超時(shí)、甚至在 handle 方法中拋出異常,均會(huì)作為失敗任務(wù)處理。

4.7 任務(wù)執(zhí)行前后的處理

Laravel提供了任務(wù)執(zhí)行前后的處理入口,即在 App/Providers/AppServiceProvider 中的 boot() 中加入如下代碼:

public function boot()
{
   Queue::before( function (JobProcessing $event) {
     Log::info("處理任務(wù)前");
   });
   Queue::after( function (JobProcessed $event) {
     Log::info("處理任務(wù)后");
   });
}

傳遞的 $event 中,帶有任務(wù)詳情,幾個(gè)簡(jiǎn)單的例子:

$event->connectionName
$event->job
$event->job->payload()

5 使用 Redis 驅(qū)動(dòng)隊(duì)列

5.1 Laravel 安裝 Predis 包

在 Laravel 中使用 Redis 之前,需要通過 Composer 安裝 predis/predis 包:

composer require predis/predis

上述拓展是幫助Laravel與Redis打交道的,我們現(xiàn)在還缺少Redis服務(wù)。

如果此時(shí)將 .env 中的 QUEUE_CONNECTION 改為 redis,訪問時(shí)會(huì)報(bào)錯(cuò):

Predis \ Connection \ ConnectionException (10061)
����Ŀ����������ܾ����޷����ӡ� [tcp://127.0.0.1:6379]

5.2 配置 Redis 服務(wù)

Redis官網(wǎng) 下載源碼后自行編譯即可。

官方并未提供Windows版,Redis的Windows版式由微軟工作組維護(hù)的,你可以從其GitHub頁 找到。不過貌似已經(jīng)不再維護(hù)了,最新的版本是16年發(fā)布的3.2.100。

Linux下通過簡(jiǎn)單的運(yùn)行

./redis-server

即可開啟服務(wù),再通過

./redis-cli

來嘗試使用Redis。使用也很簡(jiǎn)單,就是 set key value 和 get key。
Windows下安裝后,在命令行中 cd 到安裝目錄

C:\Program Files\Redis>redis-server redis.windows.conf
C:\Program Files\Redis>netstat -an|find "6379"
 TCP  127.0.0.1:6379     0.0.0.0:0       LISTENING

即可開啟Redis服務(wù)。

Redis服務(wù)的停止是通過如下命令:

C:\Program Files\Redis>redis-server --service-stop

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • php刪除一個(gè)路徑下的所有文件夾和文件的方法

    php刪除一個(gè)路徑下的所有文件夾和文件的方法

    php遍歷一個(gè)文件夾內(nèi)的所有文件和文件夾,并刪除所有文件夾和子文件夾下的所有文件的代碼,通過遞歸方式實(shí)現(xiàn)達(dá)到清空一個(gè)目錄的效果。本文給大家分享實(shí)例代碼,需要的朋友參考下
    2018-02-02
  • 詳解PHP如何完成驗(yàn)證碼功能示例

    詳解PHP如何完成驗(yàn)證碼功能示例

    這篇文章主要介紹了PHP如何完成驗(yàn)證碼功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • php微信公眾號(hào)開發(fā)模式詳解

    php微信公眾號(hào)開發(fā)模式詳解

    這篇文章主要介紹了php微信公眾號(hào)開發(fā)者模式,通過后臺(tái)服務(wù)器與微信關(guān)注用戶實(shí)現(xiàn)更多的交互作用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • codeigniter框架批量插入數(shù)據(jù)

    codeigniter框架批量插入數(shù)據(jù)

    本文介紹codeigniter框架批量插入數(shù)據(jù)的實(shí)例,優(yōu)化了其中的插入算法,大家參考使用吧
    2014-01-01
  • php更新修改excel中的內(nèi)容實(shí)例代碼

    php更新修改excel中的內(nèi)容實(shí)例代碼

    這篇文章主要介紹了php更新修改excel中的內(nèi)容實(shí)例代碼,需要的朋友可以參考下
    2014-02-02
  • apache集成php7.3.5的詳細(xì)步驟

    apache集成php7.3.5的詳細(xì)步驟

    這篇文章主要介紹了如何讓apache集成php7.3.5詳細(xì)步驟,由于僅需要 apache 和 php,不其要其他的東西,所以未選擇集成包,手動(dòng)配置 apache,讓其支持 php。,需要的朋友可以參考下
    2019-06-06
  • 在Mac OS上自行編譯安裝Apache服務(wù)器和PHP解釋器

    在Mac OS上自行編譯安裝Apache服務(wù)器和PHP解釋器

    這篇文章主要介紹了在Mac OS上編譯安裝Apache服務(wù)器和PHP解釋器的教程,盡管Mac上自帶Apache和PHP,但由于版本或者其他原因很多情況下還是自己配置更為舒心,需要的朋友可以參考下
    2015-12-12
  • php設(shè)計(jì)模式之備忘模式分析【星際爭(zhēng)霸游戲案例】

    php設(shè)計(jì)模式之備忘模式分析【星際爭(zhēng)霸游戲案例】

    這篇文章主要介紹了php設(shè)計(jì)模式之備忘模式,結(jié)合星際爭(zhēng)霸游戲案例形式分析了PHP備忘模式相關(guān)原理、使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • CodeIgniter整合Smarty的方法詳解

    CodeIgniter整合Smarty的方法詳解

    這篇文章主要介紹了CodeIgniter整合Smarty的方法,結(jié)合實(shí)例形式分析了CodeIgniter3.0.3整合Smarty3.1.27的步驟與相關(guān)設(shè)置技巧,需要的朋友可以參考下
    2017-08-08
  • PHP解決高并發(fā)問題(opcache)

    PHP解決高并發(fā)問題(opcache)

    這篇文章主要介紹了PHP解決高并發(fā)問題(opcache),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

兰西县| 涿鹿县| 焦作市| 洪泽县| 灵山县| 阜南县| 阿鲁科尔沁旗| 靖江市| 个旧市| 乌鲁木齐市| 宝坻区| 连南| 达尔| 望奎县| 鲜城| 抚州市| 奉贤区| 海晏县| 舞钢市| 台东县| 宽城| 舟曲县| 阿拉善左旗| 皮山县| 朔州市| 于都县| 东安县| 泉州市| 仙游县| 石景山区| 中山市| 茶陵县| 湖南省| 襄城县| 永康市| 绥芬河市| 丽水市| 和硕县| 广丰县| 广灵县| 灵川县|