ZeroMQ(ØMQ)是高效能非同步訊息傳輸庫,支援多種通訊模式。本文記錄在 Linux 環境下從源碼編譯安裝 ZeroMQ 核心庫、PHP-ZMQ 擴展、依賴項(libpgm、pkg-config),並驗證安裝結果。
# 安裝編譯工具鏈與基礎依賴
yum -y install gcc gcc-c++ make autoconf automake libtool git wget
# 1. 下載並解壓
cd /usr/local/src
wget https://github.com/zeromq/libzmq/releases/download/v4.3.5/zeromq-4.3.5.tar.gz
tar -zxvf zeromq-4.3.5.tar.gz
cd zeromq-4.3.5
# 2. 編譯安裝(啟用 PGM 多播協議)
./configure --prefix=/usr/local/zeromq --with-pgm
make -j$(nproc)
make install
# 3. 更新動態庫快取
echo "/usr/local/zeromq/lib" > /etc/ld.so.conf.d/zeromq.conf
ldconfig
# 錯誤提示:configure: error: Please reinstall the pkg-config distribution
cd /usr/local/src
wget https://pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz
tar -zxvf pkg-config-0.29.2.tar.gz
cd pkg-config-0.29.2
./configure --with-internal-glib
make && make install
# 驗證
pkg-config --version # 應顯示 0.29.2 或更高
# 1. 克隆源碼
cd /usr/local/src
git clone https://github.com/zeromq/php-zmq.git
cd php-zmq
# 2. phpize(需對應目標 PHP 版本的 phpize)
/usr/local/php/bin/phpize
# 3. 配置編譯選項
./configure --with-php-config=/usr/local/php/bin/php-config \
--with-zmq=/usr/local/zeromq
# 4. 編譯安裝
make -j$(nproc) && make install
# 5. 輸出類似:
# Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-nts-20190902/
# 1. 修改 php.ini
echo "extension=zmq.so" >> /usr/local/php/etc/php.ini
# 2. 重啟 PHP-FPM
systemctl restart php-fpm
# 3. 驗證
php -m | grep zmq
# 輸出:zmq
php -r "echo zmq::VERSION_MAJOR . '.' . zmq::VERSION_MINOR . '.' . zmq::VERSION_PATCH;"
# 輸出:4.3.5(與 libzmq 版本一致)
| 模式 | 別名 | 適用場景 | Socket 類型對 |
|---|---|---|---|
| Request-Reply | Hello World | 同步 RPC、任務分發 | REQ / REP |
| Publish-Subscribe | Pub/Sub | 廣播、事件通知、日誌聚合 | PUB / SUB |
| Push-Pull | Pipeline | 並行任務分發、負載均衡 | PUSH / PULL |
| Exclusive Pair | Pair | 線程間通訊 | PAIR / PAIR |
<?php
// publisher.php
$ctx = new ZMQContext();
$pub = $ctx->getSocket(ZMQ::SOCKET_PUB);
$pub->bind("tcp://*:5556");
for ($i = 0; $i < 10; $i++) {
$topic = "weather";
$data = json_encode(['temp' => rand(-20, 40), 'humidity' => rand(10, 90)]);
$pub->send($topic, ZMQ::MODE_SNDMORE); // 多部分消息:第一幀為主題
$pub->send($data);
echo "Published: $topic $data\n";
sleep(1);
}
<?php
// subscriber.php
$ctx = new ZMQContext();
$sub = $ctx->getSocket(ZMQ::SOCKET_SUB);
$sub->connect("tcp://localhost:5556");
$sub->subscribe("weather"); // 訂閱主題
while (true) {
$topic = $sub->recv(); // 第一幀
$data = $sub->recv(); // 第二幀
echo "Received [$topic]: $data\n";
}
--with-zmq 指向正確的 ZeroMQ 安裝前綴(含 include/zmq.h、lib/libzmq.so)。ldd /usr/local/php/lib/php/extensions/.../zmq.so 檢查 libzmq.so 是否可被動態鏈接器找到;需執行 ldconfig 或設定 LD_LIBRARY_PATH。setsebool -P httpd_can_network_connect 1 或調整標籤。yum install zeromq-devel + pecl install zmq(較舊但穩定)ZeroMQ 以「無中心、輕量、高效能」著稱,適合微服務間通訊、實時推送、分散式任務佇列等場景。PHP-ZMQ 擴展讓 PHP 直接享有原生級別的 ZeroMQ 能力,是高併發架構中的利器。