第一步装好配置环境
简述流程:
- 链接broker服务。new AMQPConnection();
- 在服务中创建创建通道。new AMQPChannel();
- 在通道中创建交换机。new APMQPExchange();
- 设置交换机名字,类型,持久化,申明。setName(),setType(),setFlags(),declareExchange()
- 生产者将消息发送 (delivery_mode:2。将消息持久化):publish(json_encode($msg), $routingKey, AMQP_NOPARAM, [‘delivery_mode’ => 2]) ;
- 生产者在通道中创建队列,设置名称,持久设置,声明,通过名称和路由键绑定。new AMQPQueue(),setName(),setFlags(),declareQueue(),bind($exchange->getName(), $routingKey)
- 生产者队列接收消息。queue->consume(“receive”)
第二步编写生产者和消费者
生产者 publisher.php
<?php
$value = $_POST['value']; //接收到需要到数据
$config = array(
'host' => '127.0.0.1',
'vhost' => '/',
'port' => '',
'login' => '',
'password' => ''
);
$cnn = new AMQPConnection($config); //通过config链接amqp服务
if (!$cnn->connect()) {
echo "Cannot connect to the broker";
exit();
}
$ch = new AMQPChannel($cnn); //创建一个amqp通道
$ex = new AMQPExchange($ch); //在通道内创建交换机
$routingKey = 'key'; //消息的路由键要和消费者的路由键一致
$exchangeName = 'exchange'; //交换机名称,一定要和消费者端一致,
$ex->setName($exchangeName);
//设置交换机类型
//AMQP_EX_TYPE_DIRECT:直连交换机
//AMQP_EX_TYPE_FANOUT:扇形交换机
//AMQP_EX_TYPE_HEADERS:头交换机
//AMQP_EX_TYPE_TOPIC:主题交换机
$ex->setType(AMQP_EX_TYPE_DIRECT); //此处为直连交换机
$ex->setFlags(AMQP_DURABLE); //设置交换机持久化
$ex->declareExchange(); //生命交换机
//消息内容
$msg = array(
'info' => $value,
);
//发送消息到交换机,并返回发送结果
//delivery_mode:2声明消息持久,持久的队列+持久的消息在RabbitMQ重启后才不会丢失
echo "Send Message:".$ex->publish(json_encode($msg), $routingKey, AMQP_NOPARAM, ['delivery_mode' => 2]) . PHP_EOL;
//代码执行完毕后进程会自动退出
消费者 consume.php
<?php
$config = array(
'host' => '127.0.0.1',
'vhost' => '/',
'port' => '',
'login' => '',
'password' => ''
);
//连接broker
$cnn = new AMQPConnection($config);
if (!$cnn->connect()) {
echo "Cannot connect to the broker";
exit();
}
//在连接内创建一个通道
$channel = new AMQPChannel($cnn);
//创建一个交换机
$exchange = new AMQPExchange($channel);
$routingKey = 'key'; //此处与publisher的路由键一致
$exchangeName = 'exchange'; //交换机一致
//设置交换机名称
$exchange->setName($exchangeName);
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->setFlags(AMQP_DURABLE);
$exchange->declareExchange();
//创建消息队列
$queue = new AMQPQueue($channel);
//设置队列名称
$queue->setName('queue');
$queue->setFlags(AMQP_DURABLE);
$queue->declareQueue();
$queue->bind($exchange->getName(), $routingKey); //队列绑定
//接收消息并进行处理的回调方法
function receive($envelope, $q) {
sleep(2); //休眠
$content = json_decode($envelope->getBody()); //取出publisher传来中的数据
$info = $content->info;
//wait for coding
//自行创作,mysql,redis等操作
//显式确认,队列收到消费者显式确认后,会删除该消息
$q->ack($envelope->getDeliveryTag());
}
//设置消息队列消费者回调方法,并进行阻塞
$queue->consume("receive");
//$q->consume("receive", AMQP_AUTOACK);//隐式确认,不推荐
注意:相关联的路由键(routingKey)与交换机(exchange)名称必须一致。
结尾操作
php publisher.php
php consume.php
即可。
个人学习记录。欢迎指正。
https://blog.csdn.net/weixin_38418601/article/details/110235037