laravel rabbitmq 队列

本文详细介绍了如何在Laravel项目中安装并配置RabbitMQ队列驱动,包括环境变量设置、创建Job任务类、处理方法实现以及遇到的ACCESS_REFUSED问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 安装Laravel的RabbitMQ队列驱动:

composer require vladimir-yuldashev/laravel-queue-rabbitmq

env文件配置 

#rabbitmq
QUEUE_CONNECTION=rabbitmq  #修改一下
RABBITMQ_HOST=192.168.11.4  #要连接的主机名
RABBITMQ_PORT=5671         #端口号
RABBITMQ_VHOST=/
RABBITMQ_USER=root       #mq登录名
RABBITMQ_PASSWORD=root     #mq登录密码
RABBITMQ_QUEUE=test11111         #mq连接的名称(随便写)

创建一个新的队列任务类 

php artisan make:job ProcessPodcast

ProcessPodcast任务类中实现handle方法 

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
class ProcessPodcast implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private $data;
    /**
     * Create a new job instance.
     */
    public function __construct($data)
    {
        $this->data = $data;
    }

    /**
     * Execute the job.
     */
    public function handle(): void
    {
        // 处理业务...
        echo json_encode(['1----'.date('Y-m-d H:i:s',time())]);
        sleep(5);
        echo json_encode(['2----'.date('Y-m-d H:i:s',time())]);
        sleep(5);
        echo json_encode(['3----'.date('Y-m-d H:i:s',time())]);
        sleep(5);
        echo json_encode(['4----'.date('Y-m-d H:i:s',time())]);

        $this->data['exec_time'] = date('Y-m-d H:i:s');

        Log::info($this->data);
        echo json_encode($this->data);
    }
}

配置  config/app.php 增加

VladimirYuldashev\LaravelQueueRabbitMQ\LaravelQueueRabbitMQServiceProvider::class,

配置 config/queue.php 增加

'rabbitmq' => [
        'driver'                => 'rabbitmq',

        'host'                  => env('RABBITMQ_HOST', '192.168.11.4'),
        'port'                  => env('RABBITMQ_PORT', 5671),

        'vhost'                 => env('RABBITMQ_VHOST', '/'),
        'login'                 => env('RABBITMQ_LOGIN', 'root'),
        'password'              => env('RABBITMQ_PASSWORD', 'root'),

        'queue'                 => env('RABBITMQ_QUEUE'), // name of the default queue,

        'exchange_declare'      => env('RABBITMQ_EXCHANGE_DECLARE', true), // create the exchange if not exists
        'queue_declare_bind'    => env('RABBITMQ_QUEUE_DECLARE_BIND', true), // create the queue if not exists and bind to the exchange

        'queue_params'          => [
            '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),
        ],

        'exchange_params' => [
            'name'        => env('RABBITMQ_EXCHANGE_NAME', null),
            'type'        => env('RABBITMQ_EXCHANGE_TYPE', 'direct'), // more info at http://www.rabbitmq.com/tutorials/amqp-concepts.html
            'passive'     => env('RABBITMQ_EXCHANGE_PASSIVE', false),
            'durable'     => env('RABBITMQ_EXCHANGE_DURABLE', true), // the exchange will survive server restarts
            'auto_delete' => env('RABBITMQ_EXCHANGE_AUTODELETE', false),
        ],

    ],

控制器 TestController

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Jobs\ProcessPodcast;

class TestController extends Controller
{

    /**
     * 队列
     * */
    public function rabbitmqTest(){
        // 在控制器或其他逻辑中
        $job = new ProcessPodcast(['zh'=>1]);
        dd(dispatch($job));
    }

}

运行 

php artisan queue:work

 ACCESS_REFUSED -使用身份验证机制AMQPLAIN时登录被拒绝

解决方案,ACCESS_REFUSED -使用身份验证机制AMQPLAIN时登录被拒绝-CSDN博客

 

### Laravel 中集成 RabbitMQ 进行消息队列处理 为了在 Laravel 应用程序中集成并使用 RabbitMQ 处理消息队列,需遵循一系列配置和编码实践。 #### 安装依赖包 首先,在项目根目录下的 `composer.json` 文件内添加必要的 PHP 扩展以及库支持。对于 RabbitMQ 的安装命令如下所示: ```bash composer require php-amqplib/rabbitmq-bundle ``` 此操作会引入由 Enqueue 提供的一套抽象层来简化与不同 MQ 服务之间的交互过程[^1]。 #### 配置环境变量 编辑 `.env` 文件以定义连接参数和其他选项,例如主机名、端口、用户名密码等信息: ```dotenv RABBITMQ_HOST=localhost RABBITMQ_PORT=5672 RABBITMQ_USER=guest RABBITMQ_PASSWORD=guest QUEUE_DRIVER=rabbitmq ``` 这些设置允许应用程序轻松切换不同的部署环境中对应的 RabbitMQ 实例而无需修改源码逻辑本身。 #### 创建生产者类 通过 Artisan 命令创建一个新的 Job 类作为消息发送方(Producer),该类负责向指定交换机推送数据对象实例化之后调用 publish 方法完成实际投递动作: ```php <?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use PhpAmqpLib\Message\AMQPMessage; class SendMessage implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $messageContent; /** * Create a new job instance. * * @return void */ public function __construct($content) { $this->messageContent = $content; } /** * Execute the job. * * @return void */ public function handle() { // 获取通道资源... $msg = new AMQPMessage(json_encode(['body' => $this->messageContent])); $channel->basic_publish($msg,'exchange_name','routing_key'); } } ``` 上述代码片段展示了如何构建一个简单的异步任务处理器,并将其关联到特定的消息代理上执行发布行为。 #### 设置消费者监听器 同样利用 Artisan 工具生成 Consumer 组件用于接收来自目标队列中的新条目进而触发相应的业务流程响应机制;通常情况下建议单独开启进程保持常驻运行状态以便及时捕获最新通知事件: ```php <?php namespace App\Console\Commands; use Illuminate\Console\Command; use PhpAmqpLib\Connection\AMQPLazyConnect; use PhpAmqpLib\Message\AMQPMessage; class ListenToMessages extends Command { protected $signature = 'rabbitmq:listen'; public function __invoke(AMQPLazyConnect $connection): void { /** @var \PhpAmqpLib\Channel\AMQPChannel $ch */ list($ch,) = $connection->connect(); while(true){ try { $callback = static function (AMQPMessage $msg) :void { echo "Received ",$msg->body,"\n"; // Process message here $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']); }; $ch->basic_consume('queue_name', '', false, true, false, false,$callback); while(count($ch->callbacks)){ $ch->wait(); } } catch (\Exception $e){ sleep(1); continue; // Reconnect on failure } } } } ``` 这段脚本实现了持续轮询模式下对预设主题订阅关系的有效管理,确保不会错过任何重要更新提示。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昊喵喵博士

大哥你真帅,小姐姐你真漂亮

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值