这里写目录标题
说明
- 这里只说安装rabbitmq和laravel结合rabbitmq使用,并不说怎么装nginx,php这些哈
环境
- ubuntu 16.04 (有点老,但目前手上就这一台测试用的机器。。)
- laravel 8.5
- php7.4
- RabbitMQ 3.5.7, Erlang 18.3
- “laravel/horizon”: “v5.9.10” laravel队列可视化页面(可装可不装 )
安装
-
安装rabibitmq
#安装 apt install rabbitmq-server #添加用户 rabbitmqctl add_user username password #设置刚刚添加的用户为管理员(只有管理员才能远程登录 rabbitmqctl set_user_tags username administrator #同时为用户设置读写等权限 rabbitmqctl set_permissions -p / username ".*" ".*" ".*" #安装RabbitMQ监控管理插件进行RabbitMQ的管理(可视化) rabbitmq-plugins enable rabbitmq_management #直接访问http://localhost:15672就可以看到页面了
-
安装laravel扩展
#先要确保PHP安装了sockets和amqp扩展 #安装amqp扩展 apt-get -y install librabbitmq-dev #安装vladimir-yuldashev/laravel-queue-rabbitmq,要选好版本。composer里面有对应版本的图片, composer require vladimir-yuldashev/laravel-queue-rabbitmq v11.3.0
-
修改配置文件config/queue.php,加入下面内容
'connections' => [ 'rabbitmq' => [ 'driver' => 'rabbitmq', 'queue' => env('RABBITMQ_QUEUE', 'default'), 'connection' => PhpAmqpLib\Connection\AMQPLazyConnection::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' => VladimirYuldashev\LaravelQueueRabbitMQ\Queue\Jobs\RabbitMQJob::class, ], ], /* * Set to "horizon" if you wish to use Laravel Horizon. */ 'worker' => env('RABBITMQ_WORKER', 'default'), ], ],
-
修改.env文件,加入以下内容
#RABBITMQ_WORKER这个可要可不要,如果你是安装了horizon扩展的话,这里可以直接设置成horizon,这样就可以直接通过laravel的这个可视化来查看队列的执行情况了。如果没有装,那就只能用rabbitmq的那个可视化 #新增以下内容 RABBITMQ_WORKER=horizon RABBITMQ_HOST=自己的IP或者域名 RABBITMQ_PORT=5672 RABBITMQ_LOGIN=连接rabbitmq的用户名,默认guest RABBITMQ_PASSWORD=连接rabbitmq的密码,默认guest RABBITMQ_QUEUE=队列名字 #修改以下内容 QUEUE_CONNECTION=rabbitmq
测试使用
-
创建一个队列,就简单的写入日志就行
<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Log; class TestMqJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. * * @return void */ public function __construct() { // } /** * Execute the job. * * @return void */ public function handle() { // sleep(2); Log::info(1); } }
-
创建个路由(routes/web.php),循环加入队列就行
Route::get('/test', function () { for($i=0;$i<10;$i++){ dispatch(new App\Jobs\TestMqJob()); } });
-
运行队列处理器
php artisan queue:work rabbitmq --queue=default #执行上面的命令后就可以在rabbitmq的可视化界面的connections下看到有客户端连接上去了。然后再发我test路由,就可以看到每隔2秒有数据写入到log中了
补充说明
-
安装指定版本的rabbitmq
#卸载之前安装的 apt remove rabbitmq-server #删除指定目录,不然后面安装了其他版本也无法打开服务。路径需要按照自己的来 rm -rf /etc/rabbitmq rm -rf /var/log/rabbitmq rm -rf /var/lib/rabbitmq ## 安装erlang #添加Key wget -O- https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc | sudo apt-key add - #加入源(看自己系统版本) #ubuntu 20 echo "deb https://packages.erlang-solutions.com/ubuntu focal contrib" | sudo tee /etc/apt/sources.list.d/erlang-solution.list #ubuntu 18 echo "deb https://packages.erlang-solutions.com/ubuntu bionic contrib" | sudo tee /etc/apt/sources.list.d/erlang-solution.list #ubuntu 16 echo "deb https://packages.erlang-solutions.com/ubuntu xenial contrib" | sudo tee /etc/apt/sources.list.d/erlang-solution.list #更新源 sudo apt update #查看erlang有哪些版本 apt-cache madison esl-erlang #安装erlang。先看下erlang和rabbitmq版本对比在确定装哪个。https://www.rabbitmq.com/which-erlang.html sudo apt-get install esl-erlang=1:24.3.2-1 ##安装rabbitmq-server #环境准备 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.deb.sh | sudo bash #查看版本 apt-cache madison rabbitmq-server #安装指定版本 sudo apt-get install rabbitmq-server=3.10.1-1
-
延迟队列的问题
#如果可视化使用的是laravel官方的horizon,也就是.env文件中设置为,QUEUE_CONNECTION=rabbitmq,RABBITMQ_WORKER=horizon,这个时候延迟队列会失效。必须使用rabbitmq默认的可视化工具才行,也就是RABBITMQ_WORKER=default,QUEUE_CONNECTION=rabbitmq或者RABBITMQ_WORKER=horizon,QUEUE_CONNECTION=redis #也就是说想要延迟队列有效果,那就要配置成 RABBITMQ_WORKER=default QUEUE_CONNECTION=rabbitmq #或者 RABBITMQ_WORKER=default QUEUE_CONNECTION=rabbitmq