在 composer.json 的 require 或 require-dev 中声明 ext-curl 等格式的扩展依赖,Composer 会在 install/update 时通过 extension_loaded() 静态校验;需全小写、不带版本号,拼错会提示包未找到;运行时仍需手动检查。

composer.json 里怎么声明 PHP 扩展依赖?
Composer 本身不执行运行时扩展检测,但能通过 require 字段强制声明扩展存在——这会触发安装/更新时的环境检查。关键不是“配置系统检查”,而是让 Composer 在解析依赖时就报错。
把扩展名写成 ext-curl、ext-mbstring 这种格式,加到 require 或 require-dev 里即可。Composer 会调用 extension_loaded() 做静态校验(注意:仅在 install/update 阶段,非运行时)。
-
ext-xxx必须全小写,比如ext-openssl,写成ext-OpenSSL会静默失败 - 不能带版本号(如
ext-pdo:8.1),扩展本身无语义版本,只支持*或留空 - 如果扩展名拼错(比如
ext-gd2),Composer 会提示Package ext-gd2 not found,但不会告诉你“扩展名应为ext-gd”
为什么 vendor/autoload.php 加载后 still missing extension?
因为 Composer 的扩展检查只发生在依赖解析阶段,一旦 vendor/autoload.php 被引入,环境检查早已结束。此时即使缺扩展,也不会自动抛错——除非你手动调用 extension_loaded() 或某个扩展函数触发 Fatal error。
常见误判场景:本地开发环境装了 ext-redis,CI 环境没装,但 CI 上 composer install 成功了。原因很可能是 CI 使用了缓存的 vendor 目录,跳过了依赖检查。
立即学习“PHP免费学习笔记(深入)”;
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- CI 中务必用
composer install --no-cache或先清空vendor - 若想在运行时补检,需自己加逻辑,例如在
index.php开头写:if (!extension_loaded('redis')) { die('ext-redis required'); } -
composer show --platform可列出当前环境已加载的扩展,用于调试
如何让 PHP 版本 + 扩展组合检查更严格?
单靠 ext-xxx 不够,比如你要求 php: ^8.1 且必须有 ext-sodium,但某些旧 Linux 发行版的 PHP 8.1 默认不启 sodium(它被编译为 shared 模块但未启用)。这时 Composer 仍认为满足条件。
解决方案是结合 config.platform 模拟目标环境,或用 scripts 钩子做二次验证。
- 在
composer.json中加:"config": { "platform": { "php": "8.1.10", "ext-sodium": "1" } }—— 这会让 Composer 安装时按该平台“假装”这些扩展已就位,避免因本地环境宽松导致兼容问题 - 用
scripts注册post-install-cmd,执行 shell 命令检查:php -m | grep -q sodium || (echo 'ext-sodium missing' >&2; exit 1) -
platform是静态模拟,不解决真实缺失;scripts是运行时真检,但只在本地执行,CI 需单独配置
扩展名和实际模块名不一致怎么办?
PHP 扩展的 Composer 名称不总是和 php -m 输出一致。比如 php -m 显示 zip,但 Composer 要求写 ext-zip;php -m 显示 pgsql,对应的是 ext-pgsql。最稳妥的方式是查官方扩展列表或运行 php -i | grep "Extension" -A1 确认。
- 常见易错名:
ext-iconv(不是ext-icu)、ext-bcmath(不是ext-bc)、ext-apcu(不是ext-apc) -
ext-gmp和ext-intl在某些 Docker 镜像中默认不启用,需显式docker-php-ext-enable gmp intl - Windows 下扩展名可能带
.dll后缀,但 Composer 仍只认ext-xxx格式
真正容易被忽略的是:Composer 的扩展检查只覆盖 require 解析阶段,它不介入你的代码执行流程。缺扩展的错误往往出现在第一次调用相关函数时,而不是 require 语句那里——所以别只信 composer install 成功了。


















