直接看报错末尾的ext-xxx,用php -m查是否在列表里;不在则真缺失,在则用php --ini定位CLI模式加载的php.ini并确认extension=行是否存在且未被注释。

直接看报错末尾的 ext-xxx 是哪个,然后用 php -m 查它在不在列表里——不在,就是真缺;在,再查 php --ini 加载的是哪个 php.ini,确认里面有没有对应 extension= 行。
怎么一眼锁定缺失的扩展名
Composer 报错里那句 “Root composer.json requires PHP extension ext-redis but it is missing from your system.” 不是提示,是结论。重点只看 ext-redis 这部分,别被 “requires”“but” 这些词带偏。常见被忽略的有:ext-dom、ext-fileinfo、ext-intl、ext-mbstring,它们不显眼,但 Laravel、PHPUnit、Flysystem 等包硬依赖。
错误里如果出现多个 Problem 1、Problem 2,优先处理第一个——后面往往是连锁反应,比如没 ext-xml,ext-dom 就根本加载不了。
为什么 php -m 没看到,但浏览器 phpinfo() 里有
因为 CLI 和 Web(Apache/FPM)用的是两套独立的 PHP 配置。Composer 走的是 CLI 模式,只认 php -m 的输出,和网页里看到的完全无关。
立即学习“PHP免费学习笔记(深入)”;
php --ini 输出中盯住这一行:Loaded Configuration File: /etc/php/8.2/cli/php.ini
这个路径才是 Composer 真正在读的配置文件。如果显示 (none),说明 CLI 根本没加载任何 php.ini,得手动复制一份过去。
- Ubuntu/Debian:改完
php.ini后必须跑sudo phpenmod redis(把redis换成你要的扩展名)才真正启用 - CentOS/RHEL:检查
/etc/php.d/下有没有redis.ini,且内容不是被注释掉的;extension=redis.so - macOS + Homebrew:路径通常是
/opt/homebrew/etc/php/8.2/php.ini,加完extension=redis.so要重启终端或重载 shell
临时绕过但不掩盖问题的正确姿势
--ignore-platform-reqs 是全局跳过,风险高;更安全的是只跳过特定项:
composer install --ignore-platform-req=ext-redis
这样既能让安装继续,又保留对 PHP 版本、其他扩展(如 ext-mbstring)的校验。
CI 环境推荐用 config.platform 声明目标环境,而不是在命令里加 ignore 参数:
"config": {
"platform": {
"php": "8.2.0",
"ext-gd": "8.2.0"
}
}
这能避免 lock 文件污染,也防止 autoloader 因装了不兼容版本而漏类。
验证是否真的生效,别信“改完了”
改完 php.ini 或装完扩展后,必须立刻执行:
php -m | grep redis(把 redis 换成你要验证的扩展名)
如果没输出,说明还没生效。这时候别急着重跑 composer install,先确认三件事:
-
which php和composer install调用的是同一个 PHP(尤其当系统装了多个版本时) -
php --ini显示的Loaded Configuration File路径,和你编辑的php.ini是同一个文件 -
extension=redis.so这行在php.ini里没有拼写错误、没有多余空格、没被分号注释
扩展名拼错、路径写错、CLI 和 Web 配置混用——这三类错误占了实际排查工作的七成以上。



















