1.下载amqplib类包 新建一个composer.json的文件,内容如下所示
{
"require": {
"php-amqplib/php-amqplib": ">=2.6.1"
}
}
然后执行 composer install
下载成功后vendor文件夹里有php-amqplib库,且有一个autoload.php文件可以使用自动加载
<?php
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Exchange\AMQPExchangeType;
use PhpAmqpLib\Message\AMQPMessage;
include(__DIR__ . '/config.php');
$exchange = 'someExchange';
$queueName = "queue_2";
$routeKey = "key_2";
$connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST);
$channel = $connection->channel();
//推送成功
$channel->set_ack_handler(
function (AMQPMessage $message) {
//update 订单表 set is_send_succ=ture
echo "Message acked with content " . $message->body . PHP_EOL;
}
);
//推送失败
$channel->set_nack_handler(
function (AMQPMessage $message) {
//update 订单表 set is_send_succ=false
echo "Message nacked with content " . $message->body . PHP_EOL;
}
);
$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, AMQPExchangeType::FANOUT, false, false, true);
// 队列
$channel->queue_declare($queueName, false, false, false, false);
// 使用routeKey绑定交换机和队列
$channel->queue_bind($queueName, $exchange, $routeKey);
/*
* 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();
$i = 1;
while ($i <= 10) {
$msg = new AMQPMessage($i++, array('content_type' => 'text/plain'));
$channel->basic_publish($msg, $exchange);
}
/*
* you do not have to wait for pending acks after each message sent. in fact it will be much more efficient
* to wait for as many messages to be acked as possible.
*/
$channel->wait_for_pending_acks();
$channel->close();
$connection->close();
保证消息100%发送成功思路