PHP+RabbitMQ+Swoole实现简单的消息推送

本文介绍如何使用Swoole进程池和RabbitMQ搭建消息队列系统,包括消费者和生产者的具体实现。消费者监听消息并进行处理,而生产者则负责发送消息到队列。

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

消费者 comsumer.php

<?php
/**
 * 消费者
 */

$workerNum = 4;
$pool = new Swoole\Process\Pool($workerNum);
//绑定一个事件
$pool->on("WorkerStart", function ($pool, $workerId) {
    echo "Worker#{$workerId} is started\n";
    //单个进程必须独占一个连接
    rabbitMqServer($workerId);
});
//进程关闭
$pool->on("WorkerStop", function ($pool, $workerId) {
    echo "Worker#{$workerId} is stopped\n";
});

$pool->start();

function rabbitMqServer($workerId = 0)
{
    try {
        $exchangeName = 'trade';
        $routeKey = '/trade';
        $queueName = 'trade';
        //建立连接
        $conn = new AMQPConnection([
            'host' => '127.0.0.1',
            'port' => 5672,
            'vhost' => '/',
            'login' => 'guest',
            'password' => 'guest',
        ]);
        $conn->connect();
        //创建通道
        $channel = new AMQPChannel($conn);
        //创建队列
        $queue = new AMQPQueue($channel);
        $queue->setName($queueName);
        $queue->declareQueue();
        //绑定路有关系监听
        $queue->bind($exchangeName, $routeKey);
        //消费[没有数据就是阻塞状态,有数据才会执行]
        $queue->consume(function ($envelope, $queue) use ($workerId) {
            var_dump($workerId);
            var_dump($envelope->getBody());
            $queue->ack($envelope->getDeliveryTag());//分布式手动应答机制
        });
    } catch (\Exception $exception) {
        var_dump($exception);
    }
}

生产者 producer.php

<?php
/**
 * 生产者
 */
try{
    $exchangeName = 'trade';
    $routeKey = '/trade';
    //建立连接
    $conn = new AMQPConnection([
        'host'=>'127.0.0.1',
        'port'=>5672,
        'vhost'=>'/',
        'login'=>'guest',
        'password'=>'guest',
    ]);
    $conn->connect();
    //创建通道
    $channel = new AMQPChannel($conn);
    //创建交换机
    $exchange = new AMQPExchange($channel);
    $exchange->setName($exchangeName);
    $exchange->setType(AMQP_EX_TYPE_DIRECT);
    $exchange->declareExchange();

    $data = [
        'msg_type' => 'trade',
        'tid'=> uniqid()
    ];
    //绑定路由关系发送消息
    $exchange->publish(json_encode($data),$routeKey);

}catch (\Exception $exception){
    var_dump($exception);
}

生产者即为客户端,由客户端发生任务,然后通过swoole的进程池去调用rabbitmq执行消费。

控制台执行comsumer.php,挂起消费者监听。

执行producer.php,发送任务,在消费端可看到进程号和接收到消息的输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值