• laravel使用rabbitmq队列


    说明

    • 这里只说安装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就可以看到页面了
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 安装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	
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 修改配置文件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'),
      	        
      	    ],
      
             
      ],
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
    • 修改.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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

    测试使用

    • 创建一个队列,就简单的写入日志就行

      
      
      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);
          }
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
    • 创建个路由(routes/web.php),循环加入队列就行

      Route::get('/test', function () {
      	for($i=0;$i<10;$i++){
      		dispatch(new App\Jobs\TestMqJob());
      	}
          
      });
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • 运行队列处理器

      php artisan queue:work rabbitmq --queue=default
      #执行上面的命令后就可以在rabbitmq的可视化界面的connections下看到有客户端连接上去了。然后再发我test路由,就可以看到每隔2秒有数据写入到log中了
      
      • 1
      • 2

    补充说明

    • 安装指定版本的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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
    • 延迟队列的问题

      #如果可视化使用的是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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
  • 相关阅读:
    JS 方法实现复制粘贴
    备忘录:关于C#生成商品条码
    Plato Farm全新玩法,套利ePLATO稳获超高收益
    区间查找,二分,思维
    如何防范企业内部安全威胁?
    操作系统有哪些结构?
    redis性能管理
    Microsoft Visual C++ 14.0 or greater is required.
    深度学习使用Keras进行迁移学习提升网络性能
    鉴源论坛 · 观辙丨汽车全生命周期网络安全风险管理解析
  • 原文地址:https://blog.csdn.net/wsyh12345678/article/details/126172871