服务端:
<?php
require_once __DIR__ . '/../../vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();
$exchange='order_eval'; //交换机名
$queue_name='order_eval_list'; //消息队列载体
$exchange_type='direct'; //交换机类型
$routing_key=''; //路由关键字
$durable=true; //是否持久化 true false
//第四个参数标识是否持久化【durable】
$channel->exchange_declare($exchange, $exchange_type, false, $durable, false);
//第三个参数标识是否持久化【durable】
$channel->queue_declare($queue_name, false, $durable, false, false);
$channel->queue_bind($queue_name, $exchange,$routing_key);
$res=array();
$callback = function($msg) {
#获取推送的信息
echo '获取信息:', $msg->body, "\n";
$res= $msg->body;
//file_put_contents('file.log',$res,FILE_APPEND);
//信息标签
echo $msg->delivery_info['delivery_tag']. "\n";
//消息应答机制
$result=mt_rand(0,1); #模拟信息处理逻辑, 逻辑成功-true 逻辑处理失败-false
if(!empty($result)){
#表示逻辑处理完成,并处理成功,使用ack机制应答信息(ack应答成功消息将从队列消失)
echo 'success'.PHP_EOL;
$msg->ack();
}else{
#表示逻辑处理失败,需要把信息重回队列,重新消费,使用nack机制
echo 'fail'.PHP_EOL;
echo "将消息打回,重回队列:";
$msg->nack(true);
}
// $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']); //手动发送ACK应答
//exit();
};
//在默认情况下,消息确认机制是关闭的。现在是时候开启消息确认机制,将basic_consumer的第四个参数设置为false(true表示不开启消息确认),并且工作进程处理完消息后发送确认消息。
$channel->basic_consume($queue_name, '', false, false, false, false, $callback);
while(count($channel->callbacks)) {
$channel->wait();
}
$channel->close();
$connection->close();
return $res;
客户端:
<?php
require_once __DIR__ . '/../../vendor/autoload.php';
//引入 php-amqplib 类库并且 使用必要的类:
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
//创建一个 RabbitMQ 的连接:
$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel();
$exchange='order_eval'; //交换机名
$exchange_type='direct'; //交换机类型
$durable=true; //标识是否持久化
$routing_key='';//路由关键字
//声明一个队列给我们发送消息使用;然后我们就可以将消息发送到队列中;第四个参数标识是否持久化【durable】
$channel->exchange_declare($exchange, $exchange_type, false, $durable, false);
//设为confirm模式
$channel->confirm_select();
//推送的信息内容
$data=array(
'eval_type'=>1,
'identifying'=>77,
'nickname'=>'nickname',
'rider_id'=>21,
'dispatch_no'=>'20180427105905',
'score'=>'3.5',
'tag_ids'=>'9,10',
'is_anonymou'=>0,
'content'=>'提交的内容',
'add_time'=>date('Y-m-d H:i:s')
);
$data2=json_encode($data);
$msg = new AMQPMessage($data2);
$channel->basic_publish($msg, $exchange,$routing_key);
//消息发送状态回调(成功回调)
$channel -> set_ack_handler(function (AMQPMessage $message){
echo "成功发送了内容:".$message->body;
});
//失败回调
$channel -> set_nack_handler(function (AMQPMessage $message){
echo "返回的失败信息:".$message->body;
});
$channel->wait_for_pending_acks();
$channel->close();
$connection->close();