Composer报“PHP扩展xyz缺失”需先确认扩展是否启用:运行php -m | grep xyz和php --ini核对php.ini路径,检查config.platform.ext-xyz版本约束是否过严,或Docker/CI环境是否漏装扩展。

Composer 不处理 PHP 扩展冲突,它只校验扩展是否已启用——所谓“扩展冲突”,其实是校验失败,不是依赖图层面的版本冲突。
composer install 报 “The requested PHP extension xyz is missing” 怎么办
这不是包与包之间的约束矛盾,而是当前 PHP 环境缺失 ext-xyz,或版本不匹配。Composer 在解析前就卡在 platform 检查阶段,根本不会进入依赖求解。
- 先运行
php -m | grep xyz确认扩展是否真的没装(注意大小写,比如mbstring不是MBString) - 检查
php --ini加载的是哪个php.ini,别改了错的配置文件 - 若扩展已启用但仍报错,大概率是
composer.json的config.platform.ext-xyz写死了版本,比如"ext-gd": ">=8.0",而你实际是 7.4;删掉这行或改成"ext-gd": "*"即可 - CI 环境常见问题:Docker 镜像里没装扩展,或
docker-php-ext-install没带对应模块(如gd、mbstring、xml)
为什么 composer update --ignore-platform-reqs 能过但运行时报 class not found
因为 --ignore-platform-reqs 只跳过安装时的校验,不解决运行时缺失。比如跳过 ext-mbstring 检查后强行装了 symfony/polyfill-mbstring,但某些包(如旧版 monolog/monolog)内部直接调用 mb_strlen(),而 polyfill 并未 patch 全局函数——它只提供类,不重写函数。
- polyfill 包的
replace字段声明替代ext-mbstring,只是告诉 Composer “我算数”,不代表运行时 100% 等效 - 真正安全的做法是补上扩展:Ubuntu 上
sudo apt install php-mbstring,Alpine 上apk add php82-mbstring - 若真不能装扩展(如共享主机),得确认所有依赖包都明确支持 polyfill 方式,而不是只写
"require": {"ext-mbstring": "*"}
conflict 字段会触发扩展校验失败吗
不会。conflict 只作用于包名+版本号,对 ext-* 或 php 版本无影响。校验扩展和 PHP 版本靠的是 require 和 config.platform。
- 错误写法:
"conflict": {"ext-mbstring": " —— 这字段完全被忽略 - 正确写法:在
require中声明"ext-mbstring": "*",或在config.platform中锁定"php": "8.1.22"、"ext-gd": "8.1.22" - 私有包若用
conflict声明"php": ">=8.3",那只是文本匹配,不触发任何校验;真正起作用的是config.platform.php或根require
最常被忽略的一点:本地开发环境和部署环境的 php.ini 不一致,导致 composer install 在本地成功、上线就挂。别只信 php -v,要 php -m 和 php -i | grep extension_dir 一起看。校验不是玄学,是确定性的配置比对。











