看到网上大部分都是需要先安装很多下载工具,感觉麻烦,我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!\n");
}
$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)."\n";
}
//$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!\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->declareExchange()."\n";
//创建队列
$q = new AMQPQueue($channel);
$q->setName($q_name);
$q->setFlags(AMQP_DURABLE); //持久化
echo "Message Total:".$q->declareQueue()."\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应答
}
测试代码可以分两部分,注意打开rabbitmq进程,然后运行消费者代码和生产者代码,可以看到当有消息进入队列,消费者会将消息不断打印出来,可以更好理解的使用消息队列的解耦、消峰等优点。实际项目中可以参考测试代码进一步封装处理。
rabbitmq官网:http://www.rabbitmq.com/tutorials/tutorial-one-php.html
不过我们一般不自己写,可以使用composer 去集成一下第三方:php-amqplib