PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (四) -- Push API 和 Pull API

RabbitMQ 中针对消息的分发提供了 Push API (订阅模式) Pull API (主动获取) 两种模式. 在 PHP 中, 这两种模式分别通过 AMQPQueue 类中的 consume get 方法实现.

Push API -- consume 方法

consume 简单示例

$conConfig = [
    'host' => '127.0.0.1',
    'port' => 5672,
    'login' => 'root',
    'password' => 'root',
    'vhost' => '/'
];

try
{
    $con = new AMQPConnection($conConfig);
    $con->connect();
    if(!$con->isConnected())
    {
        echo '连接失败';die;
    }
    
    $channel = new AMQPChannel($con);
    $exchange = new AMQPExchange($channel);
    $exchange->setType('fanout');
    $exchange->setName('test.ex1');
    $exchange->declareExchange();
    
    $queue = new AMQPQueue($channel);
    $queue->setName('test.consume');
    $queue->declareQueue();
    $queue->bind($exchange->getName());
    $queue->consume(function($envelope, $queue)
    {
        echo date('Y-m-d H:i:s') . ': ' . $envelope->getBody() . PHP_EOL;
    }, AMQP_AUTOACK);
    
    $con->disconnect();
}catch(Exception $e)
{
    echo $e->getMessage();
}

通过 consume 方法通过轮询方式持续从队列获取消息. 当有新消息从交换机分发到队列时, 客户端会自动处理新消息, 不用再主动地从队列请求获取消息.

Pull API -- get 方法

get 示例

$conConfig = [
    'host' => '127.0.0.1',
    'port' => 5672,
    'login' => 'root',
    'password' => 'root',
    'vhost' => '/'
];

try
{
    $con = new AMQPConnection($conConfig);
    $con->connect();
    if(!$con->isConnected())
    {
        echo '连接失败';die;
    }
    
    $channel = new AMQPChannel($con);
    $exchange = new AMQPExchange($channel);
    $exchange->setType('fanout');
    $exchange->setName('test.ex1');
    $exchange->declareExchange();
    
    $queue = new AMQPQueue($channel);
    $queue->setName('test.get');
    $queue->declareQueue();
    $msgEnvelope = $queue->get(AMQP_AUTOACK);
    if($msgEnvelope)
    {
        $msg = $msgEnvelope->getBody();
        echo $msg . PHP_EOL;
    }
    
    $con->disconnect();
}catch(Exception $e)
{
    echo $e->getMessage();
}

get 方式是主动从队列获取消息. 除非主动发起请求, 否则队列中的新消息不会推送到客户端.

producer 示例

header('Content-Type: text/html; charset=utf-8');
// 连接设置
$conConfig = [
    'host' => '127.0.0.1',
    'port' => 5672,
    'login' => 'root',
    'password' => 'root',
    'vhost' => '/'
];
try
{
    // RabbitMQ 连接实例
    $con = new AMQPConnection($conConfig);
    // 发起连接
    $con->connect();
    // 判断连接结果,true成功,false失败
    if(!$con->isConnected())
    {
        echo '连接失败';die;
    }
    // 新建通道
    $channel = new AMQPChannel($con);
    // 使用RabbitMQ的默认Exchange
    $exchange = new AMQPExchange($channel);
    $exchange->setType('fanout');
    $exchange->setName('test.ex1');
    $exchange->declareExchange();
    $i = 1;
    while(1)
    {
        $state = $exchange->publish('消息' . $i++);
        if($state)
        {
            echo 'Success' . PHP_EOL;
        }else
        {
            echo 'Fail' . PHP_EOL;
        }
        sleep(1);
    }
    
    // 关闭连接
    $con->disconnect();
}catch(Exception $e)
{
    echo $e->getMessage();
}
View Code

 

posted @ 2019-03-24 22:04  有风来  阅读(1233)  评论(0编辑  收藏  举报