推薦
設(shè)計(jì)模式-PHP觀察者設(shè)計(jì)模式
laravel事件監(jiān)聽(tīng)--模型事件新特性
深入了解laravel消費(fèi)隊(duì)列的兩種工作模式
看了laravel
手冊(cè),有時(shí)候不太理解隊(duì)列柑晒、觀察者模式、通知等眷射,這些功能的區(qū)別匙赞。想著直接在方法中處理數(shù)據(jù)庫(kù)不一樣嗎?
隊(duì)列理解
其實(shí)隊(duì)列適用于處理那些處理時(shí)間比較長(zhǎng)
的時(shí)間的事情妖碉,一般來(lái)說(shuō)是針對(duì)短信涌庭,郵件獲取其他與第三方接口對(duì)接的應(yīng)用比較實(shí)用。其實(shí)隊(duì)列是把事件往數(shù)據(jù)庫(kù)或者redis
等驅(qū)動(dòng)里面做了一次記錄欧宜。如果你的事件只是需要改動(dòng)數(shù)據(jù)表中的某個(gè)字段值的話坐榆,則不如直接對(duì)數(shù)據(jù)庫(kù)做修改比較方便,而不要實(shí)用隊(duì)列冗茸。
隊(duì)列并不會(huì)使程序變得更快席镀,它是為了讓數(shù)據(jù)變得合法。比如你完成了一個(gè)任務(wù)夏漱,需要做相應(yīng)的積分處理豪诲,這個(gè)時(shí)候,可能會(huì)涉及到計(jì)算量比較大麻蹋,一步步計(jì)算跛溉,所以可以放在隊(duì)列里面去執(zhí)行,即使計(jì)算量比較大,也會(huì)一步步來(lái)芳室,不會(huì)導(dǎo)致系統(tǒng)崩潰专肪。而創(chuàng)建任務(wù)后分發(fā)給每個(gè)用戶,就不需要使用隊(duì)列堪侯,因?yàn)闆](méi)意義嚎尤。分發(fā)也是一條SQL語(yǔ)句搞定的事情消息通知
消息通知和直接對(duì)數(shù)據(jù)庫(kù)修改也是一樣的。只是佸?通知多了「頻道(via)」這個(gè)概念伍宦。你可以比較方便的切換實(shí)用郵件(toMail)芽死,還是實(shí)用數(shù)據(jù)庫(kù)(toDatabase)通知。如果你百分比確定只實(shí)用數(shù)據(jù)庫(kù)通知次洼,其實(shí)你根本不需要實(shí)用消息通知這中寫法
對(duì)了关贵,如果你需要通知的類做了implements ShouldQueue
的實(shí)例化,則默認(rèn)會(huì)放到隊(duì)列中處理卖毁。
對(duì)了揖曾,如果使用隊(duì)列,則先后時(shí)間可以很好的把控亥啦。如果不適用隊(duì)列炭剪,則在數(shù)據(jù)庫(kù)中做一個(gè)隊(duì)列時(shí)間先后順序即可。不過(guò)這樣的話翔脱,就沒(méi)有隊(duì)列優(yōu)先級(jí)的概念了奴拦。但是依然可以添加一個(gè)字段作為優(yōu)先級(jí),按照優(yōu)先級(jí)和時(shí)間排序顯示即可届吁。order by height,create_time
事件系統(tǒng)
其實(shí)事件系統(tǒng)主要是使用了觀察者模式错妖。這個(gè)跟以上兩種情況不一樣。
之前看到一篇文章講解的是在注冊(cè)功能中的使用瓷产。如果你注冊(cè)后站玄,需要給用戶發(fā)送短信,注冊(cè)時(shí)間記錄等多個(gè)操作濒旦,你可能需要不斷的擴(kuò)展。但是使用了事件系統(tǒng)再登,你就可以很方便的處理這些問(wèn)題尔邓。代碼看上去更加簡(jiǎn)潔。但還是那句話锉矢,如果你只有一項(xiàng)需求觸發(fā)梯嗽,還是直接處理數(shù)據(jù)庫(kù)即可
laravel事件監(jiān)聽(tīng)--模型事件新特性
應(yīng)用觀察者模式的好處:
觀察者模式解除了主體和具體觀察者的耦合,讓耦合的雙方都依賴于抽象沽损,而不是依賴具體灯节。從而使得各自的變化都不會(huì)影響另一邊的變化。降低對(duì)象之間的耦合度以達(dá)到解耦的目的,符合"開(kāi)閉原則"的要求炎疆。
在 laravel
框架中卡骂,我分別使用了database
和sync
兩種模式測(cè)試了隊(duì)列,說(shuō)明隊(duì)列確實(shí)是要過(guò)數(shù)據(jù)庫(kù)的
隊(duì)列
在隊(duì)列中形入,實(shí)例化 implements ShouldQueue
才會(huì)異步執(zhí)行全跨。
<?php
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendEmail implements ShouldQueue
{
.
.
.
public function __construct($user)
{
$this->delay(5); // 這是多少秒之后執(zhí)行程序,適用于支付
}
}