报错末尾的 ext-xxx 是明确缺失扩展名,如 ext-redis;需用 php -m 验证 CLI 真实状态,按系统正确安装对应包名,并确认 php.ini 路径、重启终端及底层库版本匹配。

直接看报错末尾的 ext-xxx 是哪个
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、ext-zip、ext-json,Laravel、PHPUnit、Flysystem 等都靠它们启动。
如果报错里出现多个 Problem 1 / Problem 2,优先处理第一个。后面往往是连锁反应,比如没 ext-xml,ext-dom 根本加载不了。
用 php -m 和 php --ini 验证 CLI 真实状态
别信面板、别信浏览器 phpinfo()、别猜配置路径。Composer 走的是 PHP CLI 模式,只认 php -m 的输出。
- 运行
php -m | grep -E "zip|gd|fileinfo|dom|mbstring|json|openssl",漏一个关键扩展都可能让composer install直接失败 - 运行
php --ini,盯住Loaded Configuration File这一行路径——这才是 Composer 实际读的php.ini。显示(none)?说明 CLI 根本没加载任何配置,得手动补一份 - 运行
php -r "var_dump(extension_loaded('zip'));"(把zip换成你要查的扩展名),输出bool(false)才坐实缺失
按系统装对包名,不是“差不多就行”
装错包名 = 白干。不同发行版命名规则完全不同,且大小写、版本号、前缀都不能错:
- Ubuntu/Debian:
sudo apt install php-zip(自动启用)、sudo apt install php8.2-gd(版本必须匹配php -v输出) - CentOS/RHEL 7:
sudo yum install php-pecl-zip(不是php-zip)、sudo yum install php-gd - CentOS/RHEL 8+:
sudo dnf install php-zip、sudo dnf install php-mbstring - Alpine(Docker):
apk add php8-zip(8必须和php -v一致) - macOS + Homebrew:
brew install php@8.2-zip,再确认php.ini里有extension="zip.so" - Windows:打开
php.ini,取消;extension=zip前的分号,并确认php_zip.dll真实存在于extension_dir指向的目录中
装完不生效?这些静默失效点最常被跳过
扩展显示已安装,但 Composer 仍报错,大概率卡在以下环节:
- Linux 下装了
php-zip,但没重启终端——旧 shell 缓存着旧的模块列表,新终端才重新加载 - CLI 和 Web(Apache/Nginx/FPM)用了不同
php.ini,php --ini显示的路径才是你要改的那个 - libzip 库太旧(如 CentOS 7 自带 0.10),PHP 8.0+ 要求 ≥ 1.6.0;查版本:
pkg-config --modversion libzip,即使extension=zip加载成功,解压时也会崩溃 - Docker 中只装了
php8-zip,但没装系统级unzip命令(apk add unzip),Composer 默认优先调它,报unzip not found - Ubuntu/Debian 改完
php.ini后,必须运行sudo phpenmod zip(把zip换成你要的扩展名)才真正启用
复杂点在于:扩展名、包名、so 文件名、配置项写法、系统底层库版本、CLI 与 Web 配置隔离——五层嵌套,断一层就报错。最容易被忽略的是没验证 php --ini 输出的真实路径,以及装完不重启终端或 shell。











