Linux下编译amqp扩展必须先源码安装rabbitmq-c v0.13.0并指定安装前缀,再用phpEnv对应版本的phpize和php-config手动编译amqp-1.11.0,严禁直接pecl install或混用系统包管理器安装的librabbitmq。

Linux下编译amqp扩展必须先装rabbitmq-c,不能跳过
直接pecl install amqp在phpEnv或自编译PHP环境下大概率失败,因为amqp是C扩展,强依赖librabbitmq(即rabbitmq-c库)。系统包管理器装的版本(如apt install librabbitmq-dev)常与PHP ABI不兼容,导致make时报undefined symbol或amqp.h: No such file or directory。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 下载
rabbitmq-cv0.13.0(适配 PHP 7.4–8.2):wget https://github.com/alanxz/rabbitmq-c/archive/refs/tags/v0.13.0.tar.gz - 解压后进目录,建
build子目录,用cmake指定安装前缀:cmake -DCMAKE_INSTALL_PREFIX=/usr/local/rabbitmq-c-0.13.0 .. -
make && sudo make install后检查/usr/local/rabbitmq-c-0.13.0/lib64/librabbitmq.so是否存在;若只有lib64没lib,补软链:sudo ln -s lib64 /usr/local/rabbitmq-c-0.13.0/lib - 验证是否就位:
pkg-config --modversion librabbitmq应输出0.13.0
phpEnv下必须用对应版本的phpize和php-config,不能混用
phpEnv多版本共存,pecl install amqp会调用默认phpize,很可能绑定错PHP版本或ABI(NTS/TS),造成扩展加载后new AMQPConnection()报Class not found或undefined symbol zend_string_init。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 先确认当前激活版本:
phpenv version(如7.4.33) - 查ABI:
php -i | grep "Thread Safety",disabled为NTS,enabled为TS - 查真实
php-config路径:which php-config,必须是~/.phpenv/versions/7.4.33/bin/php-config这类路径,别信php -v显示的 - 下载匹配的amqp源码(PHP 7.4 →
amqp-1.11.0.tgz),解压后执行:~/.phpenv/versions/7.4.33/bin/phpize -
./configure --with-php-config=~/.phpenv/versions/7.4.33/bin/php-config --with-librabbitmq-dir=/usr/local/rabbitmq-c-0.13.0(路径末尾不加/)
Windows下别自己编译DLL,优先找预编译php_amqp.dll
Visual Studio + librabbitmq源码编译DLL极容易卡在librabbitmq.lib符号缺失、VC运行时版本不匹配等问题,调试成本远高于下载现成DLL。phpEnv不提供任何DLL,PECL官网也不发布二进制包。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 按三要素找DLL:PHP版本(如7.4)、ZTS状态(phpEnv多数为
Thread Safety => enabled,即TS)、架构(x64/x86,看php -v输出) - 可信来源:GitHub上
devgaze/php-amqp-binaries或amqp-windows-builds的Release页,搜amqp-1.11.0-7.4-ts-vc15-x64.zip这类命名 - 解压后把
php_amqp.dll放进php/ext/,把配套的librabbitmq.dll(不是rabbitmq.1.dll或rabbitmq.4.dll)放进php/根目录或Windows\System32 - php.ini里写
extension=php_amqp.dll(必须带.dll后缀),且确认extension_dir指向ext目录(如extension_dir = "ext") - Apache需在
httpd.conf加LoadFile "C:/path/to/php/librabbitmq.dll",否则启动时报The specified module could not be found
CLI和Web的php.ini不同,队列命令只认CLI配置
ThinkPHP的php think queue:work、Laravel的php artisan queue:work都走CLI SAPI,而浏览器访问的phpinfo()看的是Web SAPI的php.ini。很多人改了Web版php.ini并重启Apache,但CLI下php -m | grep amqp仍无输出,队列直接报Class 'AMQPConnection' not found。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 查CLI实际加载的ini:
php --ini,输出的Loaded Configuration File路径才是你要改的那个 - 在该php.ini里加
extension=amqp.so(Linux/macOS)或extension=php_amqp.dll(Windows) - CLI下直验:
php -r "var_dump(extension_loaded('amqp'));",返回bool(true)才算真正可用 - Docker环境注意:
docker-php-ext-enable amqp必须显式执行,光pecl install amqp不生效
rabbitmq-c和amqp的版本链必须咬死,Windows下DLL和librabbitmq.dll的ABI必须完全对齐——漏掉任一环,错误都不会立刻报出来,而是等到第一次new AMQPConnection()才崩。



















