windows下 PHP7 安装 扩展amqp
先搞清楚自己电脑上php的 线程安全
phpinfo 下 看 Thread Safe 值
接下来下载dll文件 地址http://pecl.php.net/package/amqp
php7.2以上的建议使用1.10.2版本
PECL :: Package :: amqp 1.10.2 for Windowshttps://pecl.php.net/package/amqp/1.10.2/windows注意 php版本 ,X86 和X64 根据自己情况 , NTS 和 TS 就是那个thread safty 的状态
下载解压
将php_amqp.dll文件放到php目录的ext文件夹下
将rabbitmq.4.dll文件放到php根目录
extension=php_amqp.dll
重启php则php扩展就安装好了
RabbitMQ的服务端不建议在Windows环境下安装,在局域网的linux服务器或者虚拟机下安装配置。本人公司开发环境正好有一个RabbitMQ服务器。
生产者代码。
<?php
$config = [
'host' => '192.168.0.5',
'vhost' => 'vhost',
'port' => 5672,
'login' => 'test',
'password' => ''
];
$connection = new \AMQPConnection($config);
$connection->connect() or die("Cannot connect to the broker!\n");
$ch = new \AMQPChannel($connection);
$ex = new \AMQPExchange($ch);
//消息的路由键,一定要和消费者端一致
$routingKey = 'pin_dat';
//交换机名称,一定要和消费者端一致,
$exchangeName = 'pin';
$ex->setName($exchangeName);
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE);
$ex->declareExchange();
//消息内容
$msg = array(
'type' => $type,
'dat' => $dat,
);
//发送消息到交换机,并返回发送结果
//delivery_mode:2声明消息持久,持久的队列+持久的消息在RabbitMQ重启后才不会丢失
$ex->publish(json_encode($msg), $routingKey, AMQP_NOPARAM, array('delivery_mode' => 2))."\n";
//代码执行完毕后进程会自动退出
$ch->close();
$connection->disconnect();// 断开连接
消费者代码
/**
* MQ consumer 消费者
*/
public function consumer(){
set_time_limit(0);
$cfg => [
'host' => '192.168.0.5',
'vhost' => 'vhost',
'port' => 5672,
'login' => 'test',
'password' => ''
];
$connection = new \AMQPConnection($config);
$connection->connect() or die("Cannot connect to the broker!\n");
//在连接内创建一个通道
$ch = new \AMQPChannel($connection);
//创建一个交换机
$ex = new \AMQPExchange($ch);
//声明路由键
$routingKey = 'pin_dat';
//声明交换机名称
$exchangeName = 'pin';
//设置交换机名称
$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();
//创建一个消息队列
$q = new \AMQPQueue($ch);
//设置队列名称
$q->setName('pin_queue');
//设置队列持久
$q->setFlags(AMQP_DURABLE);
//声明消息队列
$q->declareQueue();
//交换机和队列通过$routingKey进行绑定
$q->bind($ex->getName(), $routingKey);
//接收消息并进行处理的回调方法
//设置消息队列消费者回调方法,并进行阻塞
$q->consume(function ($envelope, $queue) {
//休眠两秒,
//sleep(1);
//echo消息内容
echo $envelope->getBody()."\n";
//显式确认,队列收到消费者显式确认后,会删除该消息
$queue->ack($envelope->getDeliveryTag());
});
//$q->consume("receive", AMQP_AUTOACK);//隐式确认,不推荐
}
先启动消费者 生产者才可以发消息成功