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!\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

 

你可能感兴趣的:(PHP)