mac 下安装rabbitmq 和配置php扩展

看到网上大部分都是需要先安装很多下载工具,感觉麻烦,我mac 上一直都仅用homebrew 管理和安装第三方的。这里分享一下步骤:

安装rabbitmq 方式: brew install rabbitmq

安装成功后可以先启动前台任务:rabbitmq-server ,不要关闭该终端窗口

可以使用浏览器登录rabbitmq 查看:http://localhost:15672 这里一定是localhost 不要用127.0.0.1,账号密码都是guest

以上说明安装rabbitmq 成功,下面开始安装php扩展

php中的rabbitmq 扩展是amqp ,而amqp依赖于rabbitmq-c ,首先需要安装rabbitmq-c

brew install rabbitmq-c

安装成功后,进入php 的安装目录中的bin 文件夹使用pecl 安装amqp:

curl 'http://pecl.php.net/get/amqp-1.9.3.tgz' -o amqp-1.9.3.tgz

sudo ./pecl install amqp-1.9.3.tgz

直至出现Set the path to librabbitmq install prefix [autodetect]

使用brew install rabbitmq-c 查询这个path,然后paste到终端。然后回车,这时候啥也不用做,知道其提示成功。

重启php-fpm

打开pathinfo(); 搜索amqp 可以看到已经有这个可扩展了。

注意:1、如果rabbitmq-server 提示命令不存在,那么需要将该安装文件下的bin目录放到~/.bash_profile 里

2、因为mac中本身带的有个php版本,如果自己再安装可能存在多个php版本,注意扩展安装对应的版本

3、扩展安装成功后,可以看到在php.ini里已经有extension=amqp.so 了,如果没有,自己添加一下

4、如果pathinfo()里没有,注意刷新,或者检查刚才哪一步是否有安装错误。如果没有,你的php是否重启,或当前版本是否对应?检查一下。

测试代码:

生产者:

//配置信息

$conn_args = array(

'host' => '127.0.0.1',

'port' => '5672',

'login' => 'guest',

'password' => 'guest',

'vhost'=>'/'

);

$e_name = 'e_meng'; //交换机名

//$q_name = 'q_meng'; //无需队列名

$k_route = 'key_meng'; //路由key

//创建连接和channel

$conn = new AMQPConnection($conn_args);

if (!$conn->connect()) {

die("Cannot connect to the broker!");

}

$channel = new AMQPChannel($conn);

//创建交换机对象

$ex = new AMQPExchange($channel);

$ex->setName($e_name);

date_default_timezone_set("Asia/Shanghai");

//发送消息

//$channel->startTransaction(); //开始事务

for($i=0; $i<5; ++$i){

sleep(1);//休眠1秒

//消息内容

$message = "TEST MESSAGE!".date("h:i:sa");

echo "Send Message:".$ex->publish($message, $k_route)."";

}

//$channel->commitTransaction(); //提交事务

$conn->disconnect();

消费者:

//配置信息

$conn_args = array(

'host' => '127.0.0.1',

'port' => '5672',

'login' => 'guest',

'password' => 'guest',

'vhost'=>'/'

);

$e_name = 'e_meng'; //交换机名

$q_name = 'q_meng'; //队列名

$k_route = 'key_meng'; //路由key

//创建连接和channel

$conn = new AMQPConnection($conn_args);

if (!$conn->connect()) {

die("Cannot connect to the broker!");

}

$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->declareExchange()."";

//创建队列

$q = new AMQPQueue($channel);

$q->setName($q_name);

$q->setFlags(AMQP_DURABLE); //持久化

echo "Message Total:".$q->declareQueue()."";

//绑定交换机与队列,并指定路由键

echo 'Queue Bind: '.$q->bind($e_name, $k_route)."";

//阻塞模式接收消息

echo "Message:";

while(True){

$q->consume('processMessage');

//$q->consume('processMessage', AMQP_AUTOACK); //自动ACK应答

}

$conn->disconnect();

/**

* 消费回调函数

* 处理消息

*/

function processMessage($envelope, $queue) {

$msg = $envelope->getBody();

echo $msg.""; //处理消息

$queue->ack($envelope->getDeliveryTag()); //手动发送ACK应答

}

测试代码可以分两部分,注意打开rabbitmq进程,然后运行消费者代码和生产者代码,可以看到当有消息进入队列,消费者会将消息不断打印出来,可以更好理解的使用消息队列的解耦、消峰等优点。实际项目中可以参考测试代码进一步封装处理。

rabbitmq官网:http://www.rabbitmq.com/tutorials/tutorial-one-php.html

不过我们一般不自己写,可以使用composer 去集成一下第三方:php-amqplib

mac 下安装rabbitmq 和配置php扩展

相关推荐