Homestead環(huán)境下laravel怎么使用RabbitMQ?下面本篇文章就來給大家介紹一下Homestead(ubuntu) + Laravel 使用RabbitMQ的方法,希望對大家有所幫助!
Homestead(ubuntu) + Laravel 使用RabbitMQ
用法1:單獨使用laravel-queue-rabbitmq
laravel安裝rabbitmq:
首先注意自己laravel-queue-rabbitmq支持的laravel版本信息:
Package Version | Laravel Version | Bug Fixes Until | |
---|---|---|---|
9 | 6 | October 5th, 2021 | Documentation |
10 | 6, 7 | October 5th, 2021 | Documentation |
11 | 8 | April 6th, 2021 | Documentation |
執(zhí)行安裝命令:
composer?require?vladimir-yuldashev/laravel-queue-rabbitmq
等待安裝完成后在config/queue.php中添加:
'connections'?=>?[ ??//?... ??'rabbitmq'?=>?[ ?????'driver'?=>?'rabbitmq', ?????'queue'?=>?env('RABBITMQ_QUEUE',?'default'), ?????'connection'?=>?PhpAmqpLibConnectionAMQPLazyConnection::class, ?????'hosts'?=>?[ ?????????[ ?????????????'host'?=>?env('RABBITMQ_HOST',?'127.0.0.1'), ?????????????'port'?=>?env('RABBITMQ_PORT',?5672), ?????????????'user'?=>?env('RABBITMQ_USER',?'guest'), ?????????????'password'?=>?env('RABBITMQ_PASSWORD',?'guest'), ?????????????'vhost'?=>?env('RABBITMQ_VHOST',?'/'), ?????????], ?????], ?????'options'?=>?[ ?????????'ssl_options'?=>?[ ?????????????'cafile'?=>?env('RABBITMQ_SSL_CAFILE',?null), ?????????????'local_cert'?=>?env('RABBITMQ_SSL_LOCALCERT',?null), ?????????????'local_key'?=>?env('RABBITMQ_SSL_LOCALKEY',?null), ?????????????'verify_peer'?=>?env('RABBITMQ_SSL_VERIFY_PEER',?true), ?????????????'passphrase'?=>?env('RABBITMQ_SSL_PASSPHRASE',?null), ?????????], ?????????'queue'?=>?[ ?????????????'job'?=>?VladimirYuldashevLaravelQueueRabbitMQQueueJobsRabbitMQJob::class, ?????????], ?????], ?????/* ??????*?Set?to?"horizon"?if?you?wish?to?use?Laravel?Horizon. ??????*/ ?????'worker'?=>?env('RABBITMQ_WORKER',?'default'), ??], ??//?...????],
并且在config/queue.php中修改:
//把sync修改為rabbitmq,同理使用redis驅動則修改為redis 'default'?=>?env('QUEUE_CONNECTION',?'sync'), 'default'?=>?env('QUEUE_CONNECTION',?'rabbitmq'), //或者修改.env下QUEUE_CONNECTION=rabbitmq QUEUE_CONNECTION=rabbitmq
執(zhí)行命令生成任務類:
php?artisan?make:job?TestQueue
修改TestQueue.php代碼:
<?php namespace AppJobs; use AppModelsUserInfo; use IlluminateBusQueueable; use IlluminateContractsQueueShouldBeUnique; use IlluminateContractsQueueShouldQueue; use IlluminateFoundationBusDispatchable; use IlluminateQueueInteractsWithQueue; use IlluminateQueueSerializesModels; class TestQueue implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; private $data; /** * Create a new job instance. * * @return void */ public function __construct($data) { // $this->data?=?$data; ????} ????/** ?????*?Execute?the?job. ?????* ?????*?@return?void ?????*/ ????public?function?handle() ????{ ????????// ????????$data?=?$this->data; ????????UserInfo::query()->firstOrCreate( ????????????["phone"?=>?$data["phone"]], ????????????["name"?=>?$data["name"]] ????????); ????} }
調用隊列函數(shù):
public?function?test(Request?$request){ ????$data?=?["name"?=>?"李大",?"phone"?=>?"12345678901"]; ????$this->dispatch(new?TestQueue($data)); }
開啟隊列:
php?artisan?queue:work
調用函數(shù)后執(zhí)行結果:
隊列消費成功,查看數(shù)據庫,數(shù)據也寫入正常。
用法2:使用laravel-queue-rabbitmq+rabbitmq-server
到這里,會有一個問題,既然方法1能夠正常使用,為什么還要加入rabbitmq-server,rabbitmq-server又是干啥的?
根據官方描述——RabbitMQ is a feature rich, multi-protocol messaging broker. It supports:
-
AMQP 0-9-1
-
AMQP 1.0
-
MQTT 3.1.1
-
STOMP 1.0 through 1.2
翻譯過來就是:RabbitMQ 是一個功能豐富的多協(xié)議消息代理。 它支持以下幾種協(xié)議。
根據RabbitMQ官網的描述:RabbitMQ runs on many operating systems and cloud environments, and provides a wide range of developer tools for most popular languages.翻譯過來就是:RabbitMQ 運行在許多操作系統(tǒng)和云環(huán)境中,并為大多數(shù)流行語言提供了廣泛的開發(fā)工具。
總結起來就是:方法1使用的是laravel隊列的使用方法,比較簡單,并沒有涉及到太多隊列當中概念性的東西(例如生產者和消費者等等),而使用rabbitmq-server,為大家提供了一個服務端,不管是什么語言,使用賬號、密碼連接到相應的host和port就能使用RabbitMQ。類似的還有EMQX(mqtt服務端)等等。并且rabbitmq-server提供了一個管理后臺,可以查看隊列的相關情況,便于管理。
啟動rabbitmq-server:
sudo?service?rabbitmq-server?start
開啟隊列:
php?artisan?queue:work
測試隊列(代碼和方法1代碼一樣)結果:
注意:
在config/queue.php的username和password里不要使用默認的guest賬號密碼來連接,否則會報錯:
The?connection?timed?out?after?3?sec?while?awaiting?incoming?data
前文已經添加過admin的賬號密碼,使用這個賬號密碼還需要給admin賬號添加權限:
sudo?rabbitmqctl?set_permissions?-p?/?admin?".*"?".*"?".*"
在rabbitmq-server管理后臺查看用戶權限:
有權限是Can access virtual hosts顯示/,無權限就是顯示No Access。
其他用法
1、laravel-queue-rabbitmq+Supervisor守護進程。本質上就是換了個隊列驅動,用法和redis無任何差別;
2、可以使用類似這種用法:java操作RabbitMQ,脫離了laravel,使用連接+生產者+消費者的方式;
3、還可以使用更復雜的用法,例如接入其他通信協(xié)議(例如MQTT),訂閱主題的方式等等,具體用法可以參考RabbitMQ官網。
總結
常規(guī)使用laravel+redis隊列+Supervisor的方式已經能滿足我們日常需要。按照錢老的《工程控制論》的說法就是——一個系統(tǒng),最新或者最先進的技術未必是最優(yōu)的,適合系統(tǒng)的、確保系統(tǒng)穩(wěn)定的才是最好的。
當然反過來我們也不能墨守成規(guī),自己的技能包也要適時的更新和進步,這樣才能無愧于自己,無愧于自己熱愛的事業(yè)。
相關推薦:最新的五個Laravel視頻教程