如果exchange没有绑定队列,消息会被丢弃。如果你创建了一个exchange,queue,并绑定了,就可以直接使用了。为了防止脚本问题,可以配合supervisor安装从网站https://packagist.org搜索rabbitmqplugins使用composer安装插件composerrequirephp-amqplib/php-amqplib用于连接RabbitMQ服务器启动一个新的通道创建一个交换创建一个队列绑定队列和交换发布消息创建一个消费者并注册一个回调函数来监控数据并创建一个新的连接和通道getMessage(),"\n";die;}$channel=$connection->channel();Createanewexchange/*name:$exchangetype:fanoutpassive:false//不检查是否存在同名的exchangedurable:false//theexchangege不会在服务器重启后存活auto_delete:true//一旦通道关闭,交换将被删除。*/try{$name='example_direct_exchange';$type="直接";$被动=假;$耐用=真;$auto_delete=true;$channel->exchange_declare($name,$type,$passive,$durable,$auto_delete);}catch(Exception$e){echo'捕获到异常:',$e->getMessage(),"\n";die;}参数nameexchangename参数typeexchange类型fanout是一个广播类型的消息,会向所有绑定的queues发送数据参数passivetrue1.如果exchange已经存在,则直接连接,不检查配置如现有exchange是fanout,则需要新建的是直接的,不会报错;2.如果交易所不存在,则直接报false1。如果exchange不存在,则创建一个新的exchange2。如果exchange已经存在,判断配置是否相同。如果配置不一样,那就直接报错。比如现有的exchange是fanout,需要建立新的exchange为direct,就会报错。参数auto_deletetrueexchange会在最后一个消费者取消订阅后自动删除。一般用于为临时exchange创建一个新队列/*name:$queue//在fanoutexchange中应该是唯一的。passive:false//不检查是否存在同名队列durable:false//队列不会在服务器重启后继续存在exclusive:false//队列可能被其他通道访问auto_delete:true//队列将通道关闭后将被删除。*/$queue1='example_direct_queue_1';$channel->queue_declare($queue1,false,true,false,false);绑定队列和交换$queue1='example_direct_queue_1';$exchange_name='example_direct_exchange';$channel->queue_bind($queue1,$exchange_name);发布消息$exchange_name='example_direct_exchange';$messageBody=array('example_direct_value'=>date('Y-m-dH:i:s'),);$message=newAMQPMessage(json_encode($messageBody));$channel->basic_publish($message,$exchange_name);创建消费者并注册回调函数/*queue:队列从哪里获取mmessagesconsumer_tag:消费者标识符no_local:不接收该消费者发布的消息。no_ack:告诉服务器消费者是否会确认消息。exclusive:请求独占消费者访问,意味着只有这个消费者可以访问:queuecallbacknowait:APHPCallback*/$consumerTag='consumer';$queue='example_direct_queue_1';$channel->basic_consume($queue,"",false,false,false,false,function($msg){$message=json_decode($msg->body,true);file_put_contents("./mq.log",$message,FILE_APPEND);$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);});参数no_acktrue消息只有在返回ack后才会被删除。虚假信息一经取出即被删除。监听数据try{while(count($channel->callbacks)){$channel->wait();}}catch(\PhpAmqpLib\Exception\AMQPTimeoutException$e){$channel->close();$通道->关闭();}
