Beanstalkd in Laravel

Beanstalkd in Laravel

概述

環(huán)境:LNMP(CentOS7.2 + Nginx1.10 + MariaDB10.0 + PHP5.6)内边,Laravel5.1;

目的:在Laravel框架上羊壹,用Beanstalkd消息隊(duì)列實(shí)現(xiàn)異步發(fā)送郵件锋边;

預(yù)備知識(shí):Laravel框架基本編程歌馍;使用Laravel自帶的Mail功能發(fā)送郵件黍氮;

正文

一般來說消息隊(duì)列有兩種場景跛十,一種是發(fā)布者訂閱者模式彤路,一種是生產(chǎn)者消費(fèi)者模式。本文討論的通過Beanstalkd發(fā)送郵件使用的就是生產(chǎn)者消費(fèi)者模式芥映。在這種模式下洲尊,讓我簡單來介紹一下什么是消息隊(duì)列,以及通過簡單的程序來了解消息隊(duì)列的使用奈偏。

一句話坞嘀,消息隊(duì)列本質(zhì)上是在程序與程序之間傳遞數(shù)據(jù)的一種方式。

使用常見的客戶端pda/pheanstalk惊来,且在封裝成單例模式類后丽涩,核心代碼就這么幾行:

生產(chǎn)者生產(chǎn)數(shù)據(jù):
Beanstalk::putInTube('queue_name', 'some string');

消費(fèi)者獲取數(shù)據(jù):
//這里的參數(shù)3是reserve timeout的秒數(shù)
$job = Beanstalk::reserveFromTube('queue_name', 3);
$data = $job->getData();

上面這些,讓我們對(duì)Beanstalkd有了概念裁蚁,以及知道了如何在普通程序下的使用它矢渊,下面讓我們進(jìn)入正題 ,探討B(tài)eanstalkd在Laravel上的使用枉证。

和Beanstalkd在普通程序下的使用不同矮男,在Laravel里Beanstalkd消費(fèi)者的數(shù)據(jù)和行為是作為一個(gè)類存在的,它們分別對(duì)應(yīng)類里的屬性和方法刽严。

說得再多不如看代碼昂灵。

代碼

編寫任務(wù),即上文說的Beanstalkd消費(fèi)者的數(shù)據(jù)和行為舞萄,也是一個(gè)類文件眨补,文件名app/Jobs/SendNewUserRegNotifyMail.php,內(nèi)容如下:

<?php

namespace App\Jobs;

use App\Jobs\Job;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
use Mail;

/**
 * 發(fā)送新用戶注冊(cè)的通知郵件給公司相關(guān)人員(如客服)
 * @author los
 */
class SendNewUserRegNotifyMail extends Job implements SelfHandling, ShouldQueue {
    protected $to_list; //收件人倒脓,示例:username<username@example.com>
    protected $data;    //郵件內(nèi)容的數(shù)據(jù)撑螺,傳遞給視圖的數(shù)組


    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($to_list, $data) {
        $this->to_list = $to_list;
        $this->data = $data;
    }


    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle() {
        Mail::send('common/mail/new_user_reg_notify_mail', $this->data, function($mail) {
            foreach ($this->to_list as $v) {
                $name = substr($v, 0, strpos($v, '<'));
                $addr = substr($v, strpos($v, '<') + 1, -1);
                $mail->to($addr, $name);
            }
            $mail->subject('新用戶注冊(cè)通知');
        });
    }

}

編寫任務(wù)調(diào)用的郵件模板,文件名resources/views/common/mail/new_user_reg_notify_mail.blade.php崎弃,內(nèi)容如下:

昵稱:{{$nickname}}<br />
聯(lián)系電話:{{$mobile}}<br />

編寫調(diào)用任務(wù)的程序甘晤,新用戶注冊(cè)時(shí)含潘,調(diào)用發(fā)送通知郵件的任務(wù),并把任務(wù)加入到指定隊(duì)列线婚,代碼如下:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

/**
 * Reg
 * @author los_gsy
 */
class RegController extends Controller {
    /**
     * 構(gòu)造函數(shù)
     */
    public function __construct(Request $req) {
        parent::__construct();
    }


/**
 * 處理用戶注冊(cè)遏弱,此時(shí) 發(fā)送新用戶注冊(cè)的通知郵件給公司相關(guān)人員(如客服)
 * @param Request $req
 */
public function handleReg(Request $req) {
    $data = ['nickname' => 'kitty', 'mobile' => '18612345678'];
    $job = new SendNewUserRegNotifyMail(['los<51220269@qq.com>'], $data);
    $job->onQueue(env('queue_default'));
    $result = dispatch($job);
    var_export($result);
}

}

至此,異步發(fā)送郵件的隊(duì)列核心代碼已完成塞弊。但漱逸,隊(duì)列不會(huì)自動(dòng)運(yùn)行,還需要有監(jiān)聽程序游沿,此時(shí)饰抒,只需要在項(xiàng)目根目錄運(yùn)行如下Artisan命令即可:

php artisan queue:work beanstalkd --queue=default --sleep=1 --tries=3 --daemon

最后,在瀏覽器輸入http://your_domain/Reg/handleReg诀黍,即可觸發(fā)通知郵件發(fā)送袋坑。

結(jié)尾

本文闡述的是在Laravel上使用Beanstalkd的核心代碼,以及代碼里體現(xiàn)出來的實(shí)踐經(jīng)驗(yàn)眯勾。因此枣宫,若無基本的Laravel使用技能,可能上手還有點(diǎn)難度咒精。但是镶柱,好的東西就值得學(xué)習(xí),不是么模叙?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歇拆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子范咨,更是在濱河造成了極大的恐慌故觅,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渠啊,死亡現(xiàn)場離奇詭異输吏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)替蛉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門贯溅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躲查,你說我怎么就攤上這事它浅。” “怎么了镣煮?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵姐霍,是天一觀的道長。 經(jīng)常有香客問我,道長镊折,這世上最難降的妖魔是什么胯府? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮恨胚,結(jié)果婚禮上骂因,老公的妹妹穿的比我還像新娘。我一直安慰自己与纽,他們只是感情好侣签,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著急迂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹦肴。 梳的紋絲不亂的頭發(fā)上僚碎,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音阴幌,去河邊找鬼勺阐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛矛双,可吹牛的內(nèi)容都是我干的渊抽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼议忽,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼懒闷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起栈幸,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤愤估,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后速址,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玩焰,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年芍锚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昔园。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡并炮,死狀恐怖默刚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渣触,我是刑警寧澤羡棵,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站嗅钻,受9級(jí)特大地震影響皂冰,放射性物質(zhì)發(fā)生泄漏店展。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一秃流、第九天 我趴在偏房一處隱蔽的房頂上張望赂蕴。 院中可真熱鬧,春花似錦舶胀、人聲如沸概说。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糖赔。三九已至,卻和暖如春轩端,著一層夾襖步出監(jiān)牢的瞬間放典,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工基茵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奋构,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓拱层,卻偏偏與公主長得像弥臼,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子根灯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理径缅,服務(wù)發(fā)現(xiàn),斷路器箱吕,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 原文鏈接 必備品 文檔:Documentation API:API Reference 視頻:Laracasts ...
    layjoy閱讀 8,607評(píng)論 0 121
  • 必備品文檔:DocumentationAPI: API Reference視頻:Laracasts速查表:Lara...
    ethanzhang閱讀 5,741評(píng)論 0 68
  • 今天在公司總部開了多半天的會(huì)芥驳,下午出來后體驗(yàn)了燒烤天氣的威力,走了不到10分鐘茬高,皮膚已經(jīng)曬得疼痛兆旬。下到地鐵以后感覺...
    飛行魚在路上閱讀 326評(píng)論 0 3
  • 今天媽和哥,小侄女回來了怎栽。好幾年沒回來丽猬,家里臟亂得不行。我休假一天熏瞄,回媽媽家?guī)兔κ帐敖潘睢j柟饷髅模L(fēng)不燥强饮,一家人忙...
    冰心心理咨詢家庭教育指導(dǎo)閱讀 369評(píng)論 0 0