【AMQP】macOS下的AMQP服务器以及PHP扩展搭建

2017-02-24 10:24:58来源:http://blog.csdn.net/diandianxiyu_geek/article/details/56667作者:CSDN博客人点击

环境说明
macOS版本, macOS Sierra 10.12.3 (16D32)
PHP集成环境, XAMPP 7.0.15-0
Apache 2.4.25,
MariaDB 10.1.21
PHP 7.0.15
前期准备
修改本地path文件
sudo vi /etc/paths


在文件的最上面添加/Applications/XAMPP/xamppfiles/bin


重启中端


bogon:~ xiaoyu$ php -v
PHP 7.0.15 (cli) (built: Jan 20 2017 07:22:25) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
安装RabbitMQ扩展
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-mac-standalone-3.6.6.tar.xz
tar -xf rabbitmq-server-mac-standalone-3.6.6.tar.xz
cd rabbitmq_server-3.6.6/
sbin/rabbitmq-server

报错 ERROR: epmd error for host bogon: timeout (timed out)



修改hosts , 增加127.0.0.1 bogon


继续


bogon:rabbitmq_server-3.6.6 xiaoyu$ sbin/rabbitmq-server
RabbitMQ 3.6.6. Copyright (C) 2007-2016 Pivotal Software, Inc.
####Licensed under the MPL.See http://www.rabbitmq.com/
####
##########Logs: /Applications/XAMPP/rabbitmq_server-3.6.6/var/log/rabbitmq/rabbit@bogon.log
########/Applications/XAMPP/rabbitmq_server-3.6.6/var/log/rabbitmq/rabbit@bogon-sasl.log
##########
Starting broker...
completed with 0 plugins.
添加到本地PATH
sudo vi /etc/paths


添加所在sbin路径/Applications/XAMPP/rabbitmq_server-3.6.6/sbin


重启终端


再次启动服务


rabbitmq-server


安装 RabbitMQ management UI

这个图形化界面是一个插件


bogon:~ xiaoyu$ rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Applying plugin configuration to rabbit@bogon... failed.
* Could not contact node rabbit@bogon.
Changes will take effect at broker restart.
* Options: --online- fail if broker cannot be contacted.
--offline - do not try to contact broker.


重启服务后,就会变成completed with 6 plugins.



访问图形化登录界面的地址为http://localhost:15672/


用户管理
# 创建用户
rabbitmqctl add_user demo pwd
# 赋予超级管理员权限
rabbimqctl set_user_tagsdemo administrator

之后就可以登录图形化管理界面了


用户标签

在创建用户的之后,需要通过标签的形式给用户赋予对应的权限


administrator | monitoring | policymaker | management |


Comma-separated list of tags to apply to the user. Currently supported by the management plugin:


- management


User can access the management plugin


- policymaker


User can access the management plugin and manage policies and parameters for the vhosts they have access to.


- monitoring


User can access the management plugin and see all connections and channels as well as node-related information.


- administrator


User can do everything monitoring can do, manage users, vhosts and permissions, close other user’s connections, and manage policies and parameters for all vhosts.


Note that you can set any tag here; the links for the above four tags are just for convenience.


安装AMQP扩展
sudo pecl install amqp
#失败
configure: error: Please reinstall the librabbitmq distribution itself or (re)install librabbitmq development package if it available in your system
安装 rabbitmq-c
git clone git://github.com/alanxz/rabbitmq-c.git
cd rabbitmq-c
git submodule init
git submodule update
#报错
bogon:rabbitmq-c xiaoyu$autoreconf -i && ./configure && make && sudo make install
Can't exec "aclocal": No such file or directory at /usr/local/Cellar/autoconf/2.69/share/autoconf/Autom4te/FileUtils.pm line 326.
autoreconf: failed to run aclocal: No such file or directory
安装 aclocal

`aclocal’ is part of automake package, try to install it first.



所以需要重新安装automake


brew install automake
继续安装rabbitmq-c
autoreconf -i
#报错
Makefile.am:6: error: Libtool library used but 'LIBTOOL' is undefined
brew install libtool
autoreconf -i
#报错
Can't exec "libtoolize": No such file or directory at /usr/local/share/autoconf/Autom4te/FileUtils.pm line 344, <GEN3> line 4.
autoreconf: failed to run libtoolize: No such file or directory
autoreconf: libtoolize is needed because this package uses Libtool
#添加PATH /usr/local/Cellar/libtool/2.4.6_1/bin
brew install boost double-conversion gflags glog libevent
sudo ln -s /usr/local/bin/glibtoolize /usr/local/bin/libtoolize

继续


autoreconf -i
./configure && make && sudo make install
#报错
./librabbitmq/amqp_openssl_bio.h:26:10: fatal error: 'openssl/bio.h' file not found
#include <openssl/bio.h>
^
1 error generated.
make[1]: *** [librabbitmq/librabbitmq_librabbitmq_la-amqp_openssl.lo] Error 1
make: *** [all] Error 2
#xcode安装openssl
xcode-select --install
xcode-select -p #找到xcode的路径
找不到 对应文件夹,失败
#编译安装openssl
git clonehttps://github.com/openssl/openssl.git
cd openssl
./config
make
make test
make install
## 编译安装报错
Cannot find "ERR_get_error(3)" in podpath: cannot find suitable replacement path, cannot resolve link
经过下面验证可以用

继续


./configure && make && sudo make install
继续安装AMQP
sudo pecl install amqp
#成功
Build process completed successfully
Installing '/Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20151012/amqp.so'
install ok: channel://pecl.php.net/amqp-1.8.0
configuration option "php_ini" is not set to php.ini location
You should add "extension=amqp.so" to php.ini

修改配置文件


重启服务器


php -m
# 扩展安装成功
[PHP Modules]
**amqp**
bcmath
bz2
calendar
Core
.....
编写测试代码
创建项目


创建composer.json
文件


{
"require": {
"php-amqplib/php-amqplib": "2.6.*"
}
}


在项目所在目录执行composer install


测试demo


配置文件config.php


<?php
require_once __DIR__ . '/vendor/autoload.php';
define('HOST', 'bogon');
define('PORT', 5672);
define('USER', 'guest');
define('PASS', 'guest');
define('VHOST', '/');
//If this is enabled you can see AMQP output on the CLI
define('AMQP_DEBUG', true);


demo文件test.php


<?php
include(__DIR__ . '/config.php');
use PhpAmqpLib/Connection/AMQPStreamConnection;
use PhpAmqpLib/Message/AMQPMessage;
$exchange = 'basic_get_test';
$queue = 'basic_get_queue';
$connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST);
$channel = $connection->channel();
/*
The following code is the same both in the consumer and the producer.
In this way we are sure we always have a queue to consume from and an
exchange where to publish messages.
*/
/*
name: $queue
passive: false
durable: true // the queue will survive server restarts
exclusive: false // the queue can be accessed in other channels
auto_delete: false //the queue won't be deleted once the channel is closed.
*/
$channel->queue_declare($queue, false, true, false, false);
/*
name: $exchange
type: direct
passive: false
durable: true // the exchange will survive server restarts
auto_delete: false //the exchange won't be deleted once the channel is closed.
*/
$channel->exchange_declare($exchange, 'direct', false, true, false);
$channel->queue_bind($queue, $exchange);
$toSend = new AMQPMessage('test message', array('content_type' => 'text/plain', 'delivery_mode' => 2));
$channel->basic_publish($toSend, $exchange);
$message = $channel->basic_get($queue);
$channel->basic_ack($message->delivery_info['delivery_tag']);
var_dump($message->body);
$channel->close();
$connection->close();


命令行运行代码php test.php
,得到debug信息,和正确的返回


< [hex]:
000041 4D 51 50 00 00 09 01AMQP....
waiting for 10,10
waiting for a new frame
> 10,10: Connection.start
Start from server, version: 0.9, properties: capabilities=(publisher_confirms=1, exchange_exchange_bindings=1, basic.nack=1, consumer_cancel_notify=1, connection.blocked=1, consumer_priorities=1, authentication_failure_close=1, per_consumer_qos=1, direct_reply_to=1), cluster_name=rabbit@bogon, copyright=Copyright (C) 2007-2016 Pivotal Software, Inc., information=Licensed under the MPL.See http://www.rabbitmq.com/, platform=Erlang/OTP, product=RabbitMQ, version=3.6.6, mechanisms: AMQPLAIN, PLAIN, locales: en_US
< 10,11:: Connection.start_ok
< [hex]:
000001 00 00 00 00 01 31 000A 00 0B 00 00 00 F3 07 ......1. ......?.
001070 72 6F 64 75 63 74 5300 00 00 07 41 4D 51 50 productS ....AMQP
00204C 69 62 08 70 6C 61 7466 6F 72 6D 53 00 00 00 Lib.plat formS...
003003 50 48 50 07 76 65 7273 69 6F 6E 53 00 00 00 .PHP.ver sionS...
004003 32 2E 36 0B 69 6E 666F 72 6D 61 74 69 6F 6E .2.6.inf ormation
005053 00 00 00 00 09 63 6F70 79 72 69 67 68 74 53 S.....co pyrightS
006000 00 00 00 0C 63 61 7061 62 69 6C 69 74 69 65 .....cap abilitie
007073 46 00 00 00 8C 1C 6175 74 68 65 6E 74 69 63 sF...?.a uthentic
008061 74 69 6F 6E 5F 66 6169 6C 75 72 65 5F 63 6C ation_fa ilure_cl
00906F 73 65 74 01 12 70 7562 6C 69 73 68 65 72 5F oset..pu blisher_
00A063 6F 6E 66 69 72 6D 7374 01 16 63 6F 6E 73 75 confirms t..consu
00B06D 65 72 5F 63 61 6E 6365 6C 5F 6E 6F 74 69 66 mer_canc el_notif
00C079 74 01 1A 65 78 63 6861 6E 67 65 5F 65 78 63 yt..exch ange_exc
00D068 61 6E 67 65 5F 62 696E 64 69 6E 67 73 74 01 hange_bi ndingst.
00E00A 62 61 73 69 63 2E 6E61 63 6B 74 01 12 63 6F .basic.n ackt..co
00F06E 6E 65 63 74 69 6F 6E2E 62 6C 6F 63 6B 65 64 nnection .blocked
010074 01 08 41 4D 51 50 4C41 49 4E 00 00 00 23 05 t..AMQPL AIN...#.
01104C 4F 47 49 4E 53 00 0000 05 67 75 65 73 74 08 LOGINS.. ..guest.
012050 41 53 53 57 4F 52 4453 00 00 00 05 67 75 65 PASSWORD S....gue
013073 74 05 65 6E 5F 55 53CEst.en_US ?
< 10,11:: Connection.start_ok
waiting for 10,20, 10,30
waiting for a new frame
> 10,30: Connection.tune
< 10,31:: Connection.tune_ok
< [hex]:
000001 00 00 00 00 00 0C 000A 00 1F FF FF 00 02 00 ........ ...??...
001000 00 00 CE...?
< 10,31:: Connection.tune_ok
< 10,40:: Connection.open
< [hex]:
000001 00 00 00 00 00 08 000A 00 28 01 2F 00 00 CE ........ ..(./..?
< 10,40:: Connection.open
waiting for 10,41
waiting for a new frame
> 10,41: Connection.open_ok
Open OK! known_hosts:
using channel_id: 1
< 20,10:: Channel.open
< [hex]:
000001 00 01 00 00 00 05 0014 00 0A 00 CE........ ....?
< 20,10:: Channel.open
waiting for 20,11
waiting for a new frame
> 20,11: Channel.open_ok
Channel open
< 50,10:: Queue.declare
< [hex]:
000001 00 01 00 00 00 1B 0032 00 0A 00 00 0F 62 61 ........ 2.....ba
001073 69 63 5F 67 65 74 5F71 75 65 75 65 02 00 00 sic_get_ queue...
002000 00 CE ..?
< 50,10:: Queue.declare
waiting for 50,11
waiting for a new frame
> 50,11: Queue.declare_ok
< 40,10:: Exchange.declare
< [hex]:
000001 00 01 00 00 00 21 0028 00 0A 00 00 0E 62 61 ......!. (.....ba
001073 69 63 5F 67 65 74 5F74 65 73 74 06 64 69 72 sic_get_ test.dir
002065 63 74 02 00 00 00 00CEect..... ?
< 40,10:: Exchange.declare
waiting for 40,11
waiting for a new frame
> 40,11: Exchange.declare_ok
< 50,20:: Queue.bind
< [hex]:
000001 00 01 00 00 00 2B 0032 00 14 00 00 0F 62 61 ......+. 2.....ba
001073 69 63 5F 67 65 74 5F71 75 65 75 65 0E 62 61 sic_get_ queue.ba
002073 69 63 5F 67 65 74 5F74 65 73 74 00 00 00 00 sic_get_ test....
003000 00 CE ..?
< 50,20:: Queue.bind
waiting for 50,21
waiting for a new frame
> 50,21: Queue.bind_ok
< 60,40:: Basic.publish
< [hex]:
000001 00 01 00 00 00 17 003C 00 28 00 00 0E 62 61 ........ <.(...ba
001073 69 63 5F 67 65 74 5F74 65 73 74 00 00 CE 02 sic_get_ test..?.
002000 01 00 00 00 1A 00 3C00 00 00 00 00 00 00 00 .......< ........
003000 0C 90 00 0A 74 65 7874 2F 70 6C 61 69 6E 02 ..?..tex t/plain.
0040CE 03 00 01 00 00 00 0C74 65 73 74 20 6D 65 73 ?....... test mes
005073 61 67 65 CE sage?
< 60,70:: Basic.get
< [hex]:
000001 00 01 00 00 00 17 003C 00 46 00 00 0F 62 61 ........ <.F...ba
001073 69 63 5F 67 65 74 5F71 75 65 75 65 00 CEsic_get_ queue.?
< 60,70:: Basic.get
waiting for 60,71, 60,72
waiting for a new frame
> 60,71: Basic.get_ok
waiting for a new frame
waiting for a new frame
< 60,80:: Basic.ack
< [hex]:
000001 00 01 00 00 00 0D 003C 00 50 00 00 00 00 00 ........ <.P.....
001000 00 01 00 CE ....?
< 60,80:: Basic.ack
string(12) "test message"
< 20,40:: Channel.close
< [hex]:
000001 00 01 00 00 00 0B 0014 00 28 00 00 00 00 00 ........ ..(.....
001000 00 CE ..?
< 20,40:: Channel.close
waiting for 20,41
waiting for a new frame
> 20,41: Channel.close_ok
< 10,50:: Connection.close
< [hex]:
000001 00 00 00 00 00 0B 000A 00 32 00 00 00 00 00 ........ ..2.....
001000 00 CE ..?
< 10,50:: Connection.close
waiting for 10,51
waiting for a new frame
> 10,51: Connection.close_ok
closing input
closing socket

到此,环境配置完成


总结

本次配置环境涉及到了


不同bash下的环境变量的修改
软件环境的相互依赖关系
编译的报错以及排查
出现问题之后的问题搜索技巧
只要可能出问题就一定出问题的墨菲定律
参考资料
http://pecl.php.net/package/amqp
http://www.php.net/manual/pl/book.amqp.php
http://www.infoq.com/cn/articles/AMQP-RabbitMQ/
http://www.th7.cn/system/mac/201409/70274.shtml
http://www.rabbitmq.com/download.html
http://stackoverflow.com/questions/9520914/installing-amqp-through-pecl
https://github.com/alanxz/rabbitmq-c
http://www.cnblogs.com/hurricane2011/articles/2503582.html
http://blog.csdn.net/sky_qing/article/details/9707647
https://github.com/facebook/redex/issues/22
https://www.openssl.org/
https://github.com/pdezwart/php-amqp
https://github.com/php-amqplib/php-amqplib

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台