laravel使用rabbitmq队列

这里写目录标题

  • 说明
  • 环境
  • 安装
      • 安装rabibitmq
      • 安装laravel扩展
      • 修改配置文件config/queue.php,加入下面内容
      • 修改.env文件,加入以下内容
  • 测试使用
      • 创建一个队列,就简单的写入日志就行
  • 补充说明
      • 安装指定版本的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就可以看到页面了
    
  • 安装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
    

测试使用

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

    
    
    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
    

你可能感兴趣的:(laravel,rabbitmq,laravel,分布式)