Laravel消息隊列##
本文所講的消息隊列是基于Beanstalkd的注暗,一些繁重的任務可以放到消息隊列里见间,后臺異步處理秋茫。
看完并實踐本系列文章,您便可以搭起來一個多層服務架構居暖,比起直連DB顽频,并發(fā)能力要提升許多
前端 <--> Redis Cache <--> 消息隊列 <--> DB
一、設置##
1.修改配置文件里config/queue.php
設置default為`beanstalkd`太闺,然后設置connections的beanstalkd糯景,beanstalkd是安裝在同一服務器,那么可使用默認的設置
-
修改環(huán)境變量 .env
QUEUE_DRIVER設置為beanstalkd
官方文檔里沒有說一步驟省骂,使得任務一直以同步的方式運行蟀淮,切記配置它
使用composer安裝pda/pheanstalk ~3.0擴展,怎么安裝前文已經(jīng)有所介紹
二钞澳、安裝beanstalkd##
sudo yum install beanstalkd
安裝beanstalkd
sudo service beanstalkd start
啟動
三怠惶、創(chuàng)建命令##
創(chuàng)建命令,由它執(zhí)行任務(如數(shù)據(jù)庫操作或圖片處理等等)略贮。
cd到你的工程目錄下甚疟,運行如下命令仗岖,生成一個命令
php artisan make:command TestQueueToEchoMsg --queued
artisan會在你的Commands目錄里生成TestQueueToEchoMsg類逃延,里面包含handle方法,你的任務即在這里執(zhí)行轧拄。
這里我只測試任務是否可以如期地被執(zhí)行揽祥,于是只是簡單地打個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的方式運行拄丰,測試成功 // $date = Carbon::now()->addSeconds(15); // // $date = Carbon::now()->addMinutes(15); // Queue::later($date, new TestQueueToEchoMsg($msg)); //延遲執(zhí)行任務,測試成功 // Queue::push( new TestQueueToEchoMsg($msg)); //立即執(zhí)行任務俐末,測試成功 Log::info('triggered'); echo "trgiered2"; }
五料按、監(jiān)聽隊列##
執(zhí)行如下命令,監(jiān)聽隊列卓箫,當有新的任務時载矿,程序會監(jiān)聽到并執(zhí)行它。
php artisan queue:listen
六烹卒、讓隊列跑起來闷盔!##
現(xiàn)在你可以在瀏覽器中輸入http://host/toQueue/hello,然后打開storage/logs/今日的log文件旅急,可以看到日志已經(jīng)打上逢勾,并且是異步的。