推薦
設(shè)計(jì)模式-PHP觀察者設(shè)計(jì)模式
laravel事件監(jiān)聽--模型事件新特性
深入了解laravel消費(fèi)隊(duì)列的兩種工作模式
看了laravel手冊(cè),有時(shí)候不太理解隊(duì)列、觀察者模式、通知等,這些功能的區(qū)別。想著直接在方法中處理數(shù)據(jù)庫不一樣嗎?
隊(duì)列理解
其實(shí)隊(duì)列適用于處理那些處理時(shí)間比較長的時(shí)間的事情,一般來說是針對(duì)短信,郵件獲取其他與第三方接口對(duì)接的應(yīng)用比較實(shí)用。其實(shí)隊(duì)列是把事件往數(shù)據(jù)庫或者redis等驅(qū)動(dòng)里面做了一次記錄。如果你的事件只是需要改動(dòng)數(shù)據(jù)表中的某個(gè)字段值的話,則不如直接對(duì)數(shù)據(jù)庫做修改比較方便,而不要實(shí)用隊(duì)列。
隊(duì)列并不會(huì)使程序變得更快,它是為了讓數(shù)據(jù)變得合法。比如你完成了一個(gè)任務(wù),需要做相應(yīng)的積分處理,這個(gè)時(shí)候,可能會(huì)涉及到計(jì)算量比較大,一步步計(jì)算,所以可以放在隊(duì)列里面去執(zhí)行,即使計(jì)算量比較大,也會(huì)一步步來,不會(huì)導(dǎo)致系統(tǒng)崩潰。而創(chuàng)建任務(wù)后分發(fā)給每個(gè)用戶,就不需要使用隊(duì)列,因?yàn)闆]意義。分發(fā)也是一條SQL語句搞定的事情消息通知
消息通知和直接對(duì)數(shù)據(jù)庫修改也是一樣的。只是佸?通知多了「頻道(via)」這個(gè)概念。你可以比較方便的切換實(shí)用郵件(toMail),還是實(shí)用數(shù)據(jù)庫(toDatabase)通知。如果你百分比確定只實(shí)用數(shù)據(jù)庫通知,其實(shí)你根本不需要實(shí)用消息通知這中寫法
對(duì)了,如果你需要通知的類做了implements ShouldQueue的實(shí)例化,則默認(rèn)會(huì)放到隊(duì)列中處理。
對(duì)了,如果使用隊(duì)列,則先后時(shí)間可以很好的把控。如果不適用隊(duì)列,則在數(shù)據(jù)庫中做一個(gè)隊(duì)列時(shí)間先后順序即可。不過這樣的話,就沒有隊(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),你就可以很方便的處理這些問題。代碼看上去更加簡潔。但還是那句話,如果你只有一項(xiàng)需求觸發(fā),還是直接處理數(shù)據(jù)庫即可
laravel事件監(jiān)聽--模型事件新特性
應(yīng)用觀察者模式的好處:
觀察者模式解除了主體和具體觀察者的耦合,讓耦合的雙方都依賴于抽象,而不是依賴具體。從而使得各自的變化都不會(huì)影響另一邊的變化。降低對(duì)象之間的耦合度以達(dá)到解耦的目的,符合"開閉原則"的要求。
在 laravel 框架中,我分別使用了database和sync兩種模式測試了隊(duì)列,說明隊(duì)列確實(shí)是要過數(shù)據(jù)庫的

隊(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í)行程序,適用于支付
}
}