一:拓展安装
composer require enqueue/amqp-lib
文档地址:https://github.com/php-enqueue/enqueue-dev/blob/master/docs/transport/amqp_lib.md
二:方法介绍
1:连接rabbitmq
$factory = new AmqpConnectionFactory([ \'host\' => \'192.168.6.88\',//host \'port\' => \'5672\',//端口 \'vhost\' => \'/\',//虚拟主机 \'user\' => \'admin\',//账号 \'pass\' => \'admin\',//密码 ]); $context = $factory->createContext();
2:声明主题
//声明并创建主题 $exchangeName = \'exchange\'; $fooTopic = $context->createTopic($exchangeName); $fooTopic->setType(AmqpTopic::TYPE_FANOUT); $context->declareTopic($fooTopic); //删除主题 $context->deleteTopic($fooTopic);
3:声明队列
//声明并创建队列 $queueName = \'rabbitmq\'; $fooQueue = $context->createQueue($queueName); $fooQueue->addFlag(AmqpQueue::FLAG_DURABLE); $context->declareQueue($fooQueue); //删除队列 $context->deleteQueue($fooQueue);
4:将队列绑定到主题
$context->bind(new AmqpBind($fooTopic, $fooQueue));
5:发送消息
//向队列发送消息 $message = $context->createMessage(\'Hello world!\'); $context->createProducer()->send($fooQueue, $message); //向队列发送优先消息 $queueName = \'rabbitmq\'; $fooQueue = $context->createQueue(queueName); $fooQueue->addFlag(AmqpQueue::FLAG_DURABLE); //设置队列的最大优先级 $fooQueue->setArguments([\'x-max-priority\' => 10]); $context->declareQueue($fooQueue); $message = $context->createMessage(\'Hello world!\'); $context->createProducer() ->setPriority(5) //设置优先级,优先级越高,消息越快到达消费者 ->send($fooQueue, $message); //向队列发送延时消息 $message = $context->createMessage(\'Hello world!\'); $context->createProducer() ->setDelayStrategy(new RabbitMqDlxDelayStrategy()) ->setDeliveryDelay(5000) //消息延时5秒 ->send($fooQueue, $message);
6:消费消息【接收消息】
//消费消息 $consumer = $context->createConsumer($fooQueue); $message = $consumer->receive(); // process a message //业务代码 $consumer->acknowledge($message);//ack应答,通知rabbitmq成功,删除对应任务 // $consumer->reject($message);ack应答,通知rabbitmq失败,不删除对应任务 //订阅消费者 $fooConsumer = $context->createConsumer($fooQueue); $subscriptionConsumer = $context->createSubscriptionConsumer(); $subscriptionConsumer->subscribe($fooConsumer, function(Message $message, Consumer $consumer) { // process message //业务代码 $consumer->acknowledge($message);//ack应答,通知rabbitmq成功,删除对应任务 // $consumer->reject($message);ack应答,通知rabbitmq失败,不删除对应任务 return true; }); $subscriptionConsumer->consume(); //清除队列消息 $queueName = \'rabbitmq\'; $queue = $context->createQueue($queueName); $context->purgeQueue($queue);
三:简单实现
1:发送消息
//连接rabbitmq $factory = new AmqpConnectionFactory([ \'host\' => \'192.168.6.88\', \'port\' => \'5672\', \'vhost\' => \'/\', \'user\' => \'admin\', \'pass\' => \'admin\', \'persisted\' => false, ]); $context = $factory->createContext(); //声明主题 $exchangeName = \'exchange\'; $fooTopic = $context->createTopic($exchangeName); $fooTopic->setType(AmqpTopic::TYPE_FANOUT); $context->declareTopic($fooTopic); //声明队列 $queueName = \'rabbitmq\'; $fooQueue = $context->createQueue($queueName); $fooQueue->addFlag(AmqpQueue::FLAG_DURABLE); $context->declareQueue($fooQueue); //将队列绑定到主题 $context->bind(new AmqpBind($fooTopic, $fooQueue)); //发送消息到队列 $message = $context->createMessage(\'Hello world!\'); $context->createProducer()->send($fooQueue, $message);
2:消费消息
$factory = new AmqpConnectionFactory([ \'host\' => \'192.168.6.88\', \'port\' => \'5672\', \'vhost\' => \'/\', \'user\' => \'admin\', \'pass\' => \'admin\', \'persisted\' => false, ]); $context = $factory->createContext(); $queueName = \'rabbitmq\'; $fooQueue = $context->createQueue($queueName); $fooConsumer = $context->createConsumer($fooQueue); $subscriptionConsumer = $context->createSubscriptionConsumer(); $subscriptionConsumer->subscribe($fooConsumer, function(Message $message, Consumer $consumer) { // process message //业务代码 $consumer->acknowledge($message);//ack应答,通知rabbitmq成功,删除对应任务 // $consumer->reject($message);ack应答,通知rabbitmq失败,不删除对应任务 return true; }); $subscriptionConsumer->consume();
© 版权声明
THE END
暂无评论内容