Laravel5.6 整合 RabbitMQ 消息隊列
簡介:
Laravel 隊列為不同的后台隊列服務提供了統一的 API,例如 Beanstalk,Amazon SQS,Redis,甚至其他基於關系型數據庫的隊列。隊列的目的是將耗時的任務延時處理,比如發送郵件,從而大幅度縮短 Web 請求和響應的時間。
隊列配置文件存放在 config/queue.php
。每一種隊列驅動的配置都可以在該文件中找到,包括數據庫、Beanstalkd、Amazon SQS、Redis以及同步(本地使用)驅動。其中還包含了一個 null
隊列驅動用於那些放棄隊列的任務。
本程序猿Laravel框架的版本為5.8(親測5.7亦可)
1、Composer 安裝 laravel-queue-rabbitmq
composer require vladimir-yuldashev/laravel-queue-rabbitmq
2、在 config/app.php 文件中,providers 中添加:
VladimirYuldashev\LaravelQueueRabbitMQ\LaravelQueueRabbitMQServiceProvider::class,
2.1、有時composer版本不足會出現種種錯誤,所以防止意外升級一下composer版本(確定無誤亦可省略)
composer update
3、在 app/config/queue.php(版本不同,大部分用戶在沒有在app目錄之下,直接config/queue.php) 配置文件中的 connections 數組中加入以下配置:
'rabbitmq' => [ 'driver' => 'rabbitmq', 'host' => env('RABBITMQ_HOST', '127.0.0.1'), 'port' => env('RABBITMQ_PORT', 5672), 'vhost' => env('RABBITMQ_VHOST', '/'), 'login' => env('RABBITMQ_LOGIN', 'guest'), 'password' => env('RABBITMQ_PASSWORD', 'guest'), 'queue' => env('RABBITMQ_QUEUE'), // name of the default queue, 'exchange_declare' => env('RABBITMQ_EXCHANGE_DECLARE', true), // create the exchange if not exists 'queue_declare_bind' => env('RABBITMQ_QUEUE_DECLARE_BIND', true), // create the queue if not exists and bind to the exchange 'queue_params' => [ 'passive' => env('RABBITMQ_QUEUE_PASSIVE', false), 'durable' => env('RABBITMQ_QUEUE_DURABLE', true), 'exclusive' => env('RABBITMQ_QUEUE_EXCLUSIVE', false), 'auto_delete' => env('RABBITMQ_QUEUE_AUTODELETE', false), ], 'exchange_params' => [ 'name' => env('RABBITMQ_EXCHANGE_NAME', null), 'type' => env('RABBITMQ_EXCHANGE_TYPE', 'direct'), // more info at http://www.rabbitmq.com/tutorials/amqp-concepts.html 'passive' => env('RABBITMQ_EXCHANGE_PASSIVE', false), 'durable' => env('RABBITMQ_EXCHANGE_DURABLE', true), // the exchange will survive server restarts 'auto_delete' => env('RABBITMQ_EXCHANGE_AUTODELETE', false), ], ],
4、修改 .env 文件
QUEUE_CONNECTION=rabbitmq #修改一下 RABBITMQ_HOST=112.74.182.5 #要連接的主機名 RABBITMQ_PORT=5672 #端口號 RABBITMQ_VHOST=/ RABBITMQ_LOGIN=admin #mq登錄名 RABBITMQ_PASSWORD=admin #mq登錄密碼 RABBITMQ_QUEUE=test11111 #mq連接的名稱(隨便寫)
PS:修改.env文件時要注意此六行代碼在你的文件中沒有重復出現,或者重復出現但“=”后面的屬性不一樣也不行,可能會引起沖突,功能出現靈異錯誤
5、創建任務類
php artisan make:job Queue
執行之后會生成一個文件 app/Jobs/Queue.php文件
修改Queue.php文件內容,下面主要的功能是添加一個時間並且轉化成json格式
<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class Queue implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; private $data; /** * Queue constructor. * @param $data */ public function __construct($data) { $this->data = $data; } /** * Execute the job. * * @return void */ public function handle() { return json_encode($this->data); } }
6、生產,把數據放進 mq 隊列,使用命令創建一個控制器
php artisan make:controller QueuedController
控制器中內容,可直接參考亦可按照自己思路修改,如下:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Jobs\Queue; class QueuedController extends Controller { public function Test(){ $arr=array( 'time'=>time() ); $this->dispatch(new Queue($arr)); echo "成功"; }
}
7、在路由配置文件--web.php 中加入一個路由,用來調用控制器中的test方法
Route::get('/test','QueuedController@test');
8、可以在瀏覽器測試代碼是否流暢
8.2同時輸入命令 、執行命令進行消費:
php artisan queue:work
例:
打開rabbitMQ中可以看到