composer不负责编译c扩展,仅检查是否加载;需手动通过phpize、configure、make、make install编译,确保php api版本、php-config路径及so文件位置三者一致,并在php.ini中启用且重启服务。

Composer 不负责编译 C 扩展,只做加载检查
因为 composer install 本质是 PHP 包管理器,不是构建工具。它只读取 composer.json 中的 "ext-xxx": "*" 这类声明,然后调用 extension_loaded('xxx') 检查扩展是否已加载——它不关心这个扩展是通过 apt install php-redis 装的,还是从源码编译来的,更不会帮你跑 phpize 或 make。
哪些包会触发手动编译?看 ext- 前缀和 GitHub 仓库结构
典型特征是:composer.json 里写了 "ext-igbinary": "*"、"ext-protobuf": "*"、"ext-grpc": "*" 这类依赖,但对应扩展没有预编译包(尤其在非标准 PHP 版本或 Alpine 环境下)。这类扩展通常:
- 源码托管在 GitHub,主分支含
php/子目录(如protocolbuffers/protobuf的php/目录) - PECL 页面明确标注 “No stable release” 或 “Not available for your PHP version”
- 运行
pecl install xxx失败,报phpize: command not found或configure: error: Cannot find php-config
手动编译必须对齐三个路径,缺一不可
常见失败不是因为没 make 成功,而是编译产出的 .so 文件被 PHP 忽略了。关键要核对:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
phpize输出的Configuring for:行,确认 PHP API 版本(如20220829)和php -v一致 -
./configure --with-php-config=/usr/bin/php-config中的路径,必须指向当前 CLI 环境的php-config(which php-config) -
make install最后打印的.so路径(如/usr/lib/php/20220829/protobuf.so),要和php --ini显示的Loaded Configuration File对应的php.ini中extension=行写的路径一致(或放在默认扩展目录下)
编译完还报 “PHP extension xxx is missing”?先别重装
此时大概率是 PHP 加载机制没生效,而不是编译失败:
- 检查
php -m | grep xxx是否真没输出——如果有了,说明 Composer 检查逻辑已通过 - 确认
php --ini和php -i | grep "Loaded Configuration File"指向同一份php.ini,且该文件里有extension=xxx.so(Linux/macOS)或extension=php_xxx.dll(Windows) - 注意:某些系统(如 Ubuntu)会把扩展配置拆到
conf.d/子目录,确保extension=行没被注释、没拼错、没写成extension=xxx(漏了.so) - 重启 PHP-FPM 或 Apache(CLI 环境不用),否则新加载的扩展不会生效
最常被忽略的是:编译时用的 phpize 和运行时 php 不是同一个版本,导致 .so 无法加载——这种错误不会在 make 阶段报,而是在 php -m 时静默失败。










