laravel rabbitmq 使用

Laravel框架
709
0
0
2022-04-14

前提条件:PHP拓展amqp协议和sockets要开启

使用方式:参见 队列

1、Composer 安装 laravel-queue-rabbitmq

composer require vladimir-yuldashev/laravel-queue-rabbitmq:v7.1.2

2、在 config/app.php 文件中,providers 中添加:

VladimirYuldashev\LaravelQueueRabbitMQ\LaravelQueueRabbitMQServiceProvider::class,

3、在 app/config/queue.php 配置文件中的 connections 数组中加入以下配置

        'rabbitmq' => [

            'driver' => 'rabbitmq',

            'dsn' => env('RABBITMQ_DSN', null),

            /*
             * Could be one a class that implements \Interop\Amqp\AmqpConnectionFactory for example:
             *  - \EnqueueAmqpExt\AmqpConnectionFactory if you install enqueue/amqp-ext
             *  - \EnqueueAmqpLib\AmqpConnectionFactory if you install enqueue/amqp-lib
             *  - \EnqueueAmqpBunny\AmqpConnectionFactory if you install enqueue/amqp-bunny
             */ 

            'factory_class' => Enqueue\AmqpLib\AmqpConnectionFactory::class,

            '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', 'default'),

            'options' => [

                'exchange' => [

                    'name' => env('RABBITMQ_EXCHANGE_NAME'),

                    /*
                     * Determine if exchange should be created if it does not exist.
                     */ 

                    'declare' => env('RABBITMQ_EXCHANGE_DECLARE', true),

                    /*
                     * Read more about possible values at https://www.rabbitmq.com/tutorials/amqp-concepts.html
                     */ 

                    'type' => env('RABBITMQ_EXCHANGE_TYPE', \Interop\Amqp\AmqpTopic::TYPE_DIRECT),'passive' => env('RABBITMQ_EXCHANGE_PASSIVE', false),'durable' => env('RABBITMQ_EXCHANGE_DURABLE', true),'auto_delete' => env('RABBITMQ_EXCHANGE_AUTODELETE', false),'arguments' => env('RABBITMQ_EXCHANGE_ARGUMENTS'),],

                'queue' => [

                    /*
                     * Determine if queue should be created if it does not exist.
                     */ 

                    'declare' => env('RABBITMQ_QUEUE_DECLARE', true),

                    /*
                     * Determine if queue should be binded to the exchange created.
                     */ 

                    'bind' => env('RABBITMQ_QUEUE_DECLARE_BIND', true),

                    /*
                     * Read more about possible values at https://www.rabbitmq.com/tutorials/amqp-concepts.html
                     */ 

                    '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),'arguments' => env('RABBITMQ_QUEUE_ARGUMENTS'),],],

            /*
             * Determine the number of seconds to sleep if there's an error communicating with rabbitmq
             * If set to false, it'll throw an exception rather than doing the sleep for X seconds.
             */ 

            'sleep_on_error' => env('RABBITMQ_ERROR_SLEEP', 5),

            /*
             * Optional SSL params if an SSL connection is used
             * Using an SSL connection will also require to configure your RabbitMQ to enable SSL. More details can be founds here: https://www.rabbitmq.com/ssl.html
             */ 

            'ssl_params' => ['ssl_on' => env('RABBITMQ_SSL', false),'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),],

        ],

4、修改 .env 文件

QUEUE_CONNECTION=rabbitmq    #这个配置env一般会有先找到修改为这个
以下是新增配置

RABBITMQ_HOST=rabbitmq  #mq的服务器地址,我这里用的是laradock,具体的就具体修改咯
RABBITMQ_PORT=5672  #mq的端口
RABBITMQ_VHOST=/
RABBITMQ_LOGIN=guest    #mq的登录名
RABBITMQ_PASSWORD=guest   #mq的密码
RABBITMQ_QUEUE=queue_name   #mq的队列名称

5、创建任务类

php artisan make:job Queue

执行之后会生成一个文件 app/Jobs/Queue.php

例子:

<?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(){print_r($this->data);}
}

6、生产,把数据放进 mq 队列

<?php

namespace App\Http\Controllers;

use App\Jobs\Queue;

class IndexController extends Controller
{

    public function index(){
        $this->dispatch(new Queue(['code' => 200, 'message' => '发布消息']));
        return "发送成功";
    }

}

7、消费队列

执行命令进行消费:

php artisan queue:work rabbitmq

Laravel