需先确认扩展名与模块名一致,再检查PHP配置是否加载,最后验证CLI和Web SAPI是否共用同一php.ini;可通过php -m、php --ini、phpinfo()及composer show --platform定位问题。

composer install / update 报错 ext-xxx 未启用怎么办
Composer 不会主动检查或启用 PHP 扩展,它只在 composer.json 的 require 或 require-dev 中声明了 ext-xxx 依赖时,才在安装前校验当前 PHP 环境是否已加载该扩展。报错如 The requested PHP extension ext-curl is missing from your system,说明 Composer 检测到扩展未启用,直接中止执行。
解决路径很明确:先确认扩展名和实际模块名是否一致,再检查 PHP 配置是否加载,最后验证 CLI 和 Web SAPI 是否使用同一份配置。
-
ext-curl对应的模块名通常是curl,但有些系统(如 Alpine)需装php-curl包;ext-intl对应intl,但依赖系统级icu库 - 运行
php -m | grep curl查 CLI 模式已启用的扩展;用php --ini确认 CLI 加载的php.ini路径 - Web 环境(如 Nginx + PHP-FPM)可能用另一份
php.ini,需单独检查phpinfo()输出中的 “Loaded Configuration File” - Windows 下扩展常以
php_curl.dll形式存在,需确保extension=php_curl.dll在php.ini中未被注释,且extension_dir指向正确目录
如何让 Composer 跳过某项 ext-\* 检查(临时绕过)
仅限开发调试或 CI 场景下临时跳过,不推荐用于生产环境。Composer 提供 --ignore-platform-req 和 --ignore-platform-reqs 两个参数控制平台依赖校验。
composer install --ignore-platform-req=ext-gd composer update --ignore-platform-reqs
注意:--ignore-platform-reqs 会跳过所有扩展、PHP 版本、其他包约束,风险较高;更安全的做法是指定单个扩展,如 --ignore-platform-req=ext-redis。但跳过后,运行时仍可能因缺少扩展抛出 Class not found 或 Call to undefined function 错误。
立即学习“PHP免费学习笔记(深入)”;
- 该参数不影响
autoload或代码执行,只绕过安装前的静态检查 - 某些包(如
symfony/console)内部仍会调用extension_loaded('mbstring'),跳过检查不能替代真实扩展 - Docker 构建中建议用
RUN docker-php-ext-install mbstring显式安装,而非依赖--ignore-platform-reqs
composer show --platform 查看当前环境支持的 ext-\*
composer show --platform 是最直接的自查命令,它列出 Composer 当前识别到的所有已启用 PHP 扩展和版本,包括 ext-*、lib-* 和 PHP 自身版本。
composer show --platform
输出类似:
php 8.2.12 ext-curl 8.2.12 ext-dom 20031129 ext-json 1.8.0 ext-mbstring 8.2.12 lib-iconv 1.17
对比 composer.json 中声明的 require,就能快速定位缺失项。若某扩展没出现在列表里,说明它没被加载——不是没安装,就是没启用,或是启用了但名字不匹配(例如装了 igbinary 却写了 ext-igbinary,而实际注册名为 igbinary)。
- 部分扩展(如
apcu)注册为ext-apcu,但模块名是apcu;redis扩展注册为ext-redis,模块名也是redis—— 名称一致性需以php -m输出为准 -
composer show --platform读取的是当前 CLI PHP 实例,与 Web 环境无关 - 若输出为空或报错,可能是 Composer 无法访问
php命令,或 PHP 二进制路径异常
为什么 php.ini 里开了 ext,composer 还报错?
最常见原因是 CLI 和 Web 使用不同 PHP 配置,或扩展虽启用但未通过 extension_loaded() 校验。比如 intl 扩展依赖系统级 ICU 库,即使 extension=intl 已写入 php.ini,若 icu*.dll(Windows)或 libicu(Linux)缺失,PHP 启动时会静默忽略该扩展,php -m 和 composer show --platform 都不会显示它。
- 用
php -i | grep -A5 "intl"查看 intl 扩展是否真被加载,关注 “ICU version” 字段是否存在 - Ubuntu/Debian 上缺 ICU:运行
sudo apt install libicu-dev,再重新编译或启用 intl - macOS Homebrew 用户:确保
icu4c已安装,并在php.ini中设置intl.icu-dir=/opt/homebrew/opt/icu4c(Apple Silicon)或对应路径 - Windows 下若用 XAMPP/MAMP,需确认其自带的
php_intl.dll与当前 PHP 版本 ABI 兼容(TS/NTS、VC 版本)
扩展加载失败往往没有明显报错,只能靠 php -m 和 php -i 交叉验证。别只信 php.ini 里的一行 extension=。











