我正在尝试使用php-amqplib库来确定如何使用Confirms(Publisher Acknowledgements),这是推荐在http://rabbitmq.com/使用RabbitMQ和PHP的库。
代码本身没有很好的文档记录,我找不到任何镜像我发现的Java和python接口的接口。
Java示例是here。
我已经尝试了各种函数名称的组合,我在PHP源代码中可以想到并且没有找到任何东西。我正在寻找类似的东西:
$channel->confirm_select();
...
$channel->wait();
看起来https://github.com/videlalvaro/php-amqplib/blob/master/PhpAmqpLib/Helper/Protocol/Protocol091.php支持该功能,但我不知道它是如何向用户公开的。
答案 0 :(得分:1)
我今天正在寻找这个,发现php-amqplib已经实现了它。
查看此demo for details。
这是一个片段:
$connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST);
$channel = $connection->channel();
$channel->set_ack_handler(
function (AMQPMessage $message) {
echo "Message acked with content " . $message->body . PHP_EOL;
}
);
$channel->set_nack_handler(
function (AMQPMessage $message) {
echo "Message nacked with content " . $message->body . PHP_EOL;
}
);
/*
* bring the channel into publish confirm mode.
* if you would call $ch->tx_select() befor or after you brought the channel into this mode
* the next call to $ch->wait() would result in an exception as the publish confirm mode and transactions
* are mutually exclusive
*/
$channel->confirm_select();
/*
name: $exchange
type: fanout
passive: false // don't check if an exchange with the same name exists
durable: false // the exchange won't survive server restarts
auto_delete: true //the exchange will be deleted once the channel is closed.
*/
$channel->exchange_declare($exchange, 'fanout', false, false, true);
$i = 1;
$msg = new AMQPMessage($i, array('content_type' => 'text/plain'));
$channel->basic_publish($msg, $exchange);
/*
* watching the amqp debug output you can see that the server will ack the message with delivery tag 1 and the
* multiple flag probably set to false
*/
$channel->wait_for_pending_acks();
答案 1 :(得分:0)
显然,PECL AMQP库和纯php-amqplib库都没有实现Confirms扩展。此时唯一真正的解决方案是实现两个队列来模拟发布者的确认。
有计划在两个图书馆中实施确认,但我看不出任何动向。