必须在composer.json的require或require-dev中用ext-xxx声明,版本号仅支持*或留空;扩展名须与php -m输出完全一致(小写、含必要下划线),如ext-pdo_mysql;config.platform.ext-xxx用于模拟缺失而非跳过检查。

必须在 composer.json 的 require 或 require-dev 字段中,用 ext-xxx 格式声明,且版本号只能是 * 或留空——其他写法(如 "^8.0"、"5.3.7")都会被忽略或报错。
ext-xxx 声明位置和语法限制
扩展依赖不是配置项,也不是插件行为,而是 Composer 内建的平台依赖识别机制。它只认 require 和 require-dev 下的键名,不接受任何其他字段(比如 config.platform 里写 "ext-redis": "5.3.7" 是无效的)。
-
ext-curl中的curl必须与php -m输出的模块名完全一致:小写、无下划线、无后缀(ext-curl✅,ext-CURL❌,ext-php-curl❌) - 版本约束仅支持
*或空字符串("ext-gd": ""等价于"ext-gd": "*"),"^3.0"、">=1.2"等写法会被 Composer 完全忽略 - 若项目实际只在某个分支逻辑中用到
ext-igbinary,但又不想强依赖,应移出require,改用suggest+ 运行时extension_loaded('igbinary')判断
为什么写了 ext-xxx 却没报错?常见漏检原因
声明了 "ext-xml": "*",composer install 却成功通过,运行时才报 Class 'DOMDocument' not found —— 这通常不是 Composer 失效,而是环境本身已加载该扩展,只是功能不全。
-
ext-xml是“容器”,真正提供DOMDocument的是dom模块,但它不属于独立扩展名,而是xml扩展的一部分;Composer 只检查extension_loaded('xml'),不校验子功能 - 某些扩展(如
mbstring)在 PHP 编译时被静态链接,php -m不显示,但extension_loaded('mbstring')返回true;Composer 依赖后者,所以仍能通过 - 你本地开了
ext-opcache,但 CI 环境未启用,又没在require中声明 —— 此时必须补上,否则无法触发校验
config.platform.ext-xxx 的真实作用
config.platform 下的 ext-xxx 不是用来“跳过检查”的,而是用来“模拟缺失”或“降级声明”——它只在你明确想覆盖当前环境时才有意义。
-
"config": { "platform": { "ext-redis": false } }表示:即使当前环境有redis扩展,也假装没有,强制让依赖解析走不带 redis 的分支 -
"ext-redis": true等价于不写,因为默认就按真实环境判断;写"ext-redis": "0"才是常用 trick,等效于false - CI 脚本中慎用
--ignore-platform-reqs:它会绕过所有ext-xxx和php版本检查,导致锁文件生成失真
最容易被忽略的是:扩展名大小写和拼写必须和 php -m 输出严格一致,而很多文档写的 ext-pdo_mysql 实际应为 ext-pdo_mysql(下划线保留),但 php -m 显示的是 pdo_mysql —— 这个下划线是允许的,也是唯一正确形式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











