composer 不安装 php 扩展,只管理项目依赖;报“ext-xxx not found”是因为当前 php 环境缺失对应扩展,需系统级安装(如 apt/yum/brew)或配置 php.ini 启用。

Composer 本身不安装 PHP 扩展,它只管理 PHP 项目依赖(即 composer.json 中的包),而 PHP 扩展(如 ext-mbstring、ext-curl)必须由系统或 PHP 环境本身提供。
为什么 composer require 会报 “ext-xxx not found” 错误
这是最常被误解的点:Composer 在 install 或 update 时检查的是当前 PHP 运行环境已加载的扩展列表,不是帮你装扩展。它读取 composer.json 中的 require 和 require-dev,也看 platform 配置或 config.platform,但所有这些只是“声明你期望的环境”,不等于“自动满足环境”。
常见错误现象:
- 运行
composer install报错:The requested PHP extension ext-gd is missing from your system. - 本地能跑,部署到服务器就失败,因为服务器 PHP 缺少对应
.so或.dll - 用了
config.platform.php掩盖问题,结果运行时报Call to undefined function gd_info()
怎么确认当前 PHP 环境缺哪个扩展
别猜,直接查。Composer 的报错只提示名字,但你要知道它对应系统里哪个实际扩展名(比如 ext-intl 对应 intl 扩展)。
立即学习“PHP免费学习笔记(深入)”;
- 运行
php -m查看已启用模块(注意大小写和连字符:输出是mbstring,不是ext-mbstring) - 运行
php -i | grep "Loaded Configuration File"确认用的是哪个php.ini - 打开对应
php.ini,搜索extension=行,看是否启用了目标扩展(如extension=gd或extension=php_gd2.dll) - 在代码里加
var_dump(extension_loaded('gd'));验证运行时是否真可用
不同系统下安装 PHP 扩展的真实操作路径
这才是真正“安装扩展”的地方。Composer 不参与这一步。
- Ubuntu/Debian:
sudo apt install php-gd php-mbstring php-curl php-xml php-zip(注意:PHP 版本号可能要加后缀,如php8.1-gd) - CentOS/RHEL:
sudo yum install php-gd php-mbstring php-xml或dnf install php-gd php-mbstring - macOS(Homebrew + php@8.2):
brew install php@8.2默认带常用扩展;若需额外扩展,如intl,需brew install icu4c后重装 php - Windows(XAMPP/WAMP):打开
php.ini,取消注释对应行,如;extension=php_gd2.dll→ 改成extension=php_gd2.dll,然后重启 Apache/Nginx - Docker:在
Dockerfile中用docker-php-ext-install gd mbstring intl或pecl install安装,不能只靠composer install
什么时候该用 config.platform?它不是补丁
它只在一种场景下合理:你明确知道目标环境有某扩展,但 Composer 检测不到(比如 PHP 运行在容器外,而 composer install 在容器内执行,且容器没装扩展),又不想让 CI 卡住。但它掩盖了真实环境缺陷。
- 正确用法(仅限构建时跳过检查):
"config": { "platform": { "php": "8.2.10", "ext-gd": "8.2.10", "ext-mbstring": "8.2.10" } } - 危险用法:用它绕过缺失
ext-pdo_mysql,结果上线连不上数据库 - 替代方案更安全:CI 中先
apt install扩展,再composer install;本地开发用php -v和php -m做准入检查
真正的难点从来不在 Composer 命令怎么敲,而在于分清「声明依赖」和「提供运行时能力」是两件事。很多人卡在部署环节,翻遍 Composer 文档却找不到“安装扩展”的按钮——因为那根本不是它的职责。











