Laravel消息隊(duì)列##
本文所講的消息隊(duì)列是基于Beanstalkd的,一些繁重的任務(wù)可以放到消息隊(duì)列里,后臺(tái)異步處理。
看完并實(shí)踐本系列文章,您便可以搭起來(lái)一個(gè)多層服務(wù)架構(gòu),比起直連DB,并發(fā)能力要提升許多
前端 <--> Redis Cache <--> 消息隊(duì)列 <--> DB
一、設(shè)置##
1.修改配置文件里config/queue.php
設(shè)置default為`beanstalkd`,然后設(shè)置connections的beanstalkd,beanstalkd是安裝在同一服務(wù)器,那么可使用默認(rèn)的設(shè)置
-
修改環(huán)境變量 .env
QUEUE_DRIVER設(shè)置為beanstalkd
官方文檔里沒(méi)有說(shuō)一步驟,使得任務(wù)一直以同步的方式運(yùn)行,切記配置它
使用composer安裝pda/pheanstalk ~3.0擴(kuò)展,怎么安裝前文已經(jīng)有所介紹
二、安裝beanstalkd##
sudo yum install beanstalkd
安裝beanstalkd
sudo service beanstalkd start
啟動(dòng)
三、創(chuàng)建命令##
創(chuàng)建命令,由它執(zhí)行任務(wù)(如數(shù)據(jù)庫(kù)操作或圖片處理等等)。
cd到你的工程目錄下,運(yùn)行如下命令,生成一個(gè)命令
php artisan make:command TestQueueToEchoMsg --queued
artisan會(huì)在你的Commands目錄里生成TestQueueToEchoMsg類,里面包含handle方法,你的任務(wù)即在這里執(zhí)行。
這里我只測(cè)試任務(wù)是否可以如期地被執(zhí)行,于是只是簡(jiǎn)單地打個(gè)log即可,handle方法如下
public function handle()
{
Log::info('at '.time().' log by queue and the msg is:'.$this->msg);
}
四、coding##
-
router.php添加如下代碼
Route::get('toQueue/{msg}', 'QueueController@triggerQueue');
-
QueueController里添加如下代碼
public function triggerQueue( $msg ){ Log::info('ready to trigger2'); $this->dispatch(new TestQueueToEchoMsg($msg)); //commond bus的方式運(yùn)行,測(cè)試成功 // $date = Carbon::now()->addSeconds(15); // // $date = Carbon::now()->addMinutes(15); // Queue::later($date, new TestQueueToEchoMsg($msg)); //延遲執(zhí)行任務(wù),測(cè)試成功 // Queue::push( new TestQueueToEchoMsg($msg)); //立即執(zhí)行任務(wù),測(cè)試成功 Log::info('triggered'); echo "trgiered2"; }
五、監(jiān)聽(tīng)隊(duì)列##
執(zhí)行如下命令,監(jiān)聽(tīng)隊(duì)列,當(dāng)有新的任務(wù)時(shí),程序會(huì)監(jiān)聽(tīng)到并執(zhí)行它。
php artisan queue:listen
六、讓隊(duì)列跑起來(lái)!##
現(xiàn)在你可以在瀏覽器中輸入http://host/toQueue/hello,然后打開(kāi)storage/logs/今日的log文件,可以看到日志已經(jīng)打上,并且是異步的。