两年前曾发过一篇《用python尝试rabbitmq》,没想到两年后的今天,基于php的amqp资料还是少得可怜,原来的几个扩展也都一个个被废弃,只剩amqp还健在,且被pecl收录。虽说被收录,可官方手册中的信息还是略显单薄。
言归正传,amqp扩展的安装就不多说了,可参看前几天发的那篇《给php安装amqp扩展》
装好了amqp后就可以开始编写代码了:
消费者:接收消息
逻辑:
创建连接-->创建channel-->创建交换机-->创建队列-->绑定交换机/队列/路由键-->接收消息
[php]
'192.168.1.93',
'port' => '5672',
'login' => 'guest',
'password' => 'guest',
'vhost'=>'/'
);
$e_name = 'e_linvo'; //交换机名
$q_name = 'q_linvo'; //队列名
$k_route = 'key_1'; //路由key
//创建连接和channel
$conn = new amqpconnection($conn_args);
if (!$conn->connect()) {
die(cannot connect to the broker!\n);
}
$channel = new amqpchannel($conn);
//创建交换机
$ex = new amqpexchange($channel);
$ex->setname($e_name);
$ex->settype(amqp_ex_type_direct); //direct类型
$ex->setflags(amqp_durable); //持久化
echo exchange status:.$ex->declare().\n;
//创建队列
$q = new amqpqueue($channel);
$q->setname($q_name);
$q->setflags(amqp_durable); //持久化
echo message total:.$q->declare().\n;
//绑定交换机与队列,并指定路由键
echo 'queue bind: '.$q->bind($e_name, $k_route).\n;
//阻塞模式接收消息
echo message:\n;
while(true){
$q->consume('processmessage');
//$q->consume('processmessage', amqp_autoack); //自动ack应答
}
$conn->disconnect();
/**
* 消费回调函数
* 处理消息
*/
function processmessage($envelope, $queue) {
$msg = $envelope->getbody();
echo $msg.\n; //处理消息
$queue->ack($envelope->getdeliverytag()); //手动发送ack应答
}
生产者:发送消息
逻辑:
创建连接-->创建channel-->创建交换机对象-->发送消息
[php]
'192.168.1.93',
'port' => '5672',
'login' => 'guest',
'password' => 'guest',
'vhost'=>'/'
);
$e_name = 'e_linvo'; //交换机名
//$q_name = 'q_linvo'; //无需队列名
$k_route = 'key_1'; //路由key
//创建连接和channel
$conn = new amqpconnection($conn_args);
if (!$conn->connect()) {
die(cannot connect to the broker!\n);
}
$channel = new amqpchannel($conn);
//消息内容
$message = test message! 测试消息!;
//创建交换机对象
$ex = new amqpexchange($channel);
$ex->setname($e_name);
//发送消息
//$channel->starttransaction(); //开始事务
for($i=0; $i echo send message:.$ex->publish($message, $k_route).\n;
}
//$channel->committransaction(); //提交事务
$conn->disconnect();
需要注意的地方是:
queue对象有两个方法可用于取消息:consume和get。
前者是阻塞的,无消息时会被挂起,适合循环中使用;
后者则是非阻塞的,取消息时有则取,无则返回false。
测试截图
运行消费者:
运行生产者,发消息:
消费者接收到消息:
作者:linvo
http://www.bkjia.com/phpjc/478053.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/478053.htmltecharticle两年前曾发过一篇《用python尝试rabbitmq》,没想到两年后的今天,基于php的amqp资料还是少得可怜,原来的几个扩展也都一个个被废弃,只剩...
