【AMQP】macOS下的AMQP伺服器以及PHP擴充套件搭建
環境說明
- 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_tags demo 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 clone https://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 PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;
$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]:
0000 41 4D 51 50 00 00 09 01 AMQP....
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]:
0000 01 00 00 00 00 01 31 00 0A 00 0B 00 00 00 F3 07 ......1. ......?.
0010 70 72 6F 64 75 63 74 53 00 00 00 07 41 4D 51 50 productS ....AMQP
0020 4C 69 62 08 70 6C 61 74 66 6F 72 6D 53 00 00 00 Lib.plat formS...
0030 03 50 48 50 07 76 65 72 73 69 6F 6E 53 00 00 00 .PHP.ver sionS...
0040 03 32 2E 36 0B 69 6E 66 6F 72 6D 61 74 69 6F 6E .2.6.inf ormation
0050 53 00 00 00 00 09 63 6F 70 79 72 69 67 68 74 53 S.....co pyrightS
0060 00 00 00 00 0C 63 61 70 61 62 69 6C 69 74 69 65 .....cap abilitie
0070 73 46 00 00 00 8C 1C 61 75 74 68 65 6E 74 69 63 sF...?.a uthentic
0080 61 74 69 6F 6E 5F 66 61 69 6C 75 72 65 5F 63 6C ation_fa ilure_cl
0090 6F 73 65 74 01 12 70 75 62 6C 69 73 68 65 72 5F oset..pu blisher_
00A0 63 6F 6E 66 69 72 6D 73 74 01 16 63 6F 6E 73 75 confirms t..consu
00B0 6D 65 72 5F 63 61 6E 63 65 6C 5F 6E 6F 74 69 66 mer_canc el_notif
00C0 79 74 01 1A 65 78 63 68 61 6E 67 65 5F 65 78 63 yt..exch ange_exc
00D0 68 61 6E 67 65 5F 62 69 6E 64 69 6E 67 73 74 01 hange_bi ndingst.
00E0 0A 62 61 73 69 63 2E 6E 61 63 6B 74 01 12 63 6F .basic.n ackt..co
00F0 6E 6E 65 63 74 69 6F 6E 2E 62 6C 6F 63 6B 65 64 nnection .blocked
0100 74 01 08 41 4D 51 50 4C 41 49 4E 00 00 00 23 05 t..AMQPL AIN...#.
0110 4C 4F 47 49 4E 53 00 00 00 05 67 75 65 73 74 08 LOGINS.. ..guest.
0120 50 41 53 53 57 4F 52 44 53 00 00 00 05 67 75 65 PASSWORD S....gue
0130 73 74 05 65 6E 5F 55 53 CE st.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]:
0000 01 00 00 00 00 00 0C 00 0A 00 1F FF FF 00 02 00 ........ ...??...
0010 00 00 00 CE ...?
< 10,31:: Connection.tune_ok
< 10,40:: Connection.open
< [hex]:
0000 01 00 00 00 00 00 08 00 0A 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]:
0000 01 00 01 00 00 00 05 00 14 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]:
0000 01 00 01 00 00 00 1B 00 32 00 0A 00 00 0F 62 61 ........ 2.....ba
0010 73 69 63 5F 67 65 74 5F 71 75 65 75 65 02 00 00 sic_get_ queue...
0020 00 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]:
0000 01 00 01 00 00 00 21 00 28 00 0A 00 00 0E 62 61 ......!. (.....ba
0010 73 69 63 5F 67 65 74 5F 74 65 73 74 06 64 69 72 sic_get_ test.dir
0020 65 63 74 02 00 00 00 00 CE ect..... ?
< 40,10:: Exchange.declare
waiting for 40,11
waiting for a new frame
> 40,11: Exchange.declare_ok
< 50,20:: Queue.bind
< [hex]:
0000 01 00 01 00 00 00 2B 00 32 00 14 00 00 0F 62 61 ......+. 2.....ba
0010 73 69 63 5F 67 65 74 5F 71 75 65 75 65 0E 62 61 sic_get_ queue.ba
0020 73 69 63 5F 67 65 74 5F 74 65 73 74 00 00 00 00 sic_get_ test....
0030 00 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]:
0000 01 00 01 00 00 00 17 00 3C 00 28 00 00 0E 62 61 ........ <.(...ba
0010 73 69 63 5F 67 65 74 5F 74 65 73 74 00 00 CE 02 sic_get_ test..?.
0020 00 01 00 00 00 1A 00 3C 00 00 00 00 00 00 00 00 .......< ........
0030 00 0C 90 00 0A 74 65 78 74 2F 70 6C 61 69 6E 02 ..?..tex t/plain.
0040 CE 03 00 01 00 00 00 0C 74 65 73 74 20 6D 65 73 ?....... test mes
0050 73 61 67 65 CE sage?
< 60,70:: Basic.get
< [hex]:
0000 01 00 01 00 00 00 17 00 3C 00 46 00 00 0F 62 61 ........ <.F...ba
0010 73 69 63 5F 67 65 74 5F 71 75 65 75 65 00 CE sic_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]:
0000 01 00 01 00 00 00 0D 00 3C 00 50 00 00 00 00 00 ........ <.P.....
0010 00 00 01 00 CE ....?
< 60,80:: Basic.ack
string(12) "test message"
< 20,40:: Channel.close
< [hex]:
0000 01 00 01 00 00 00 0B 00 14 00 28 00 00 00 00 00 ........ ..(.....
0010 00 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]:
0000 01 00 00 00 00 00 0B 00 0A 00 32 00 00 00 00 00 ........ ..2.....
0010 00 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
相關文章
- php amqp擴充套件安裝PHPMQ套件
- PHP 安裝 amqp、rabbitmq 擴充套件PHPMQ套件
- [轉貼][php擴充套件-amqp]安裝PHP套件MQ
- PHP:windows安裝AMQP擴充PHPWindowsMQ
- php以及php擴充套件memcache 安裝PHP套件
- macOS Sierra系統下PHP5.6安裝memcached擴充套件MacPHP套件
- PHP擴充套件開發就是一個自己的PHP擴充套件PHP套件
- Spring AMQP:RabbitTemplate SimpleMessageListenerContainerSpringMQAI
- CentOS 下安裝 PHP Swoole 擴充套件CentOSPHP套件
- centos下為php新增gd擴充套件CentOSPHP套件
- 新增php擴充套件PHP套件
- Linux下編寫一個PHP擴充套件LinuxPHP套件
- MAC下安裝php-redis擴充套件MacPHPRedis套件
- 開發php擴充套件PHP套件
- PHP 擴充套件安裝PHP套件
- 在Nodejs下與Rabbitmq訊息伺服器通訊(node-amqp)NodeJSMQ伺服器
- centos7 yum安裝php5.6以及擴充套件CentOSPHP套件
- 在Windows下為PHP安裝redis擴充套件WindowsPHPRedis套件
- CentOS 系統下 PHP 怎麼新增擴充套件?CentOSPHP套件
- PHP 安裝 yaconf 擴充套件PHP套件
- (MAC) PHP擴充套件安裝MacPHP套件
- php8.2 redis擴充套件PHPRedis套件
- Go開發PHP擴充套件GoPHP套件
- PHP安裝redis擴充套件PHPRedis套件
- php新增pcntl擴充套件(Linux)PHP套件Linux
- php mysql擴充套件安裝PHPMySql套件
- MacOs 安裝擴充套件錯誤列表Mac套件
- 一個簡單的 Amqp 封裝MQ封裝
- centos安裝php的oracle擴充套件CentOSPHPOracle套件
- PHP的LZF壓縮擴充套件工具PHP套件
- Homestead 安裝 MongoDB 以及擴充套件!MongoDB套件
- Centos6下給PHP安裝Qconf擴充套件CentOSPHP套件
- Mac 下使用 pecl 安裝 PHP 的 swoole 擴充套件實踐MacPHP套件
- Mac下使用Pecl安裝PHP的Swoole擴充套件實踐MacPHP套件
- 【PHP】php安裝bcmath擴充套件指令碼PHP套件指令碼
- PHP:php7.2.3 安裝pcntl 擴充套件PHP套件
- php 擴充套件安裝(隨筆)PHP套件
- PHP 操作 Redis 之 phpredis 擴充套件PHPRedis套件
- laragon 新增 PHP_Redis 擴充套件GoPHPRedis套件