composer install 报 ext-xxx 缺失时,需先确认 CLI 环境是否真缺失:执行 which php、php --ini、php -m | grep xxx 三步验证;Linux/macOS 常因未启用模块导致不显示,需用 phpenmod 或手动配置 php.ini;--ignore-platform-reqs 仅跳过校验,不解决运行时问题,应慎用。

composer install 报 ext-xxx 缺失,先确认是不是真缺
不是所有“缺失”都是真的——composer install 只看 CLI 环境,和浏览器里 phpinfo() 显示的完全无关。你看到报错说 ext-gd 缺失,但网页能正常显示图片,不代表 CLI 也启用了它。
验证方法只有两个命令,顺序不能错:
-
which php—— 确认 Composer 调用的是哪个 PHP(比如/usr/bin/php或/opt/homebrew/bin/php) -
php --ini—— 找到 CLI 加载的配置文件路径,重点盯Loaded Configuration File行(如/etc/php/8.2/cli/php.ini) -
php -m | grep gd—— 直接查扩展是否在 CLI 已加载列表里
如果 php -m 没输出,但 phpinfo() 有,说明 Web 和 CLI 配置分离,必须改 CLI 的 php.ini,不是 Web 的。
Linux/macOS 下装完包却 php -m 不显示扩展
常见原因是模块没启用,不是没安装。Ubuntu/Debian 装了 php-gd 后,还得手动启用:
立即学习“PHP免费学习笔记(深入)”;
-
sudo phpenmod gd(对 CLI 和 Apache 都生效) - CentOS/RHEL:检查
/etc/php.d/gd.ini是否存在且未被注释(即内容是extension=gd,不是;extension=gd) - macOS + Homebrew:装完
brew install php@8.2-gd后,确认php --ini指向的php.ini里有extension="gd"这一行(注意引号格式,部分版本要加)
如果 php --ini 输出 Loaded Configuration File: (none),代表 PHP 根本没加载任何配置文件,得手动复制一份 php.ini 到对应路径并重命名(比如从 php.ini.default 复制)。
--ignore-platform-reqs 是绕过检查,不是解决问题
加 --ignore-platform-reqs 能让 composer install 成功,但只是跳过校验,不解决运行时崩溃风险:
- 如果代码里调用了
new Redis(),而系统没装ext-redis,运行时照样报Class 'Redis' not found - 它同时跳过 PHP 版本、所有扩展、系统库校验,容易装入不兼容包(比如 PHP 8.3 下装了只兼容 8.2 的包)
- 真正需要的往往是精准忽略:
composer install --ignore-platform-req=ext-gd(只跳过 gd),或--ignore-platform-req=php(只跳过 PHP 版本) -
--ignore-platform-reqs必须放在命令末尾,否则会被当成包名解析失败
CI/CD 中用它没问题,只要最终部署环境已配好;本地开发慎用,尤其当你共享 composer.lock 给队友时,会掩盖真实依赖问题。
扩展声明写法错误导致检测失效
Composer 只识别 ext- 开头的声明,其他写法完全无效:
- ✅ 正确:
"ext-gd": "*"、"ext-intl": "^7.4" - ❌ 无效:
"gd": "*"、"intl": "^7.4"、"php-gd": "*" - 漏写
ext-前缀,composer check-platform-reqs就不会报错,但运行时可能崩 -
config.platform.ext-gd可用于兜底声明版本,但它仍需真实扩展可用,否则composer install仍会失败(除非加 ignore 参数)
扩展加载了不代表功能完整——比如 ext-intl 加载成功,但 ICU 版本太旧,composer install 不会拦,但后续 new \IntlDateFormatter() 可能抛异常。



















