答案是需逐层验证PHP CLI扩展加载状态并按系统安装对应扩展:先用php -r验证extension_loaded,再php --ini定位配置文件,最后依Ubuntu用apt install php-zip、CentOS 7用yum install php-pecl-zip、macOS用brew install php@8.2-zip、Windows取消php.ini中分号注释,装后重启终端并检查libzip版本≥1.6.0。

报错“requires ext-xxx”或“The xxx extension is missing”,说明 Composer 在启动前就卡在 PHP 环境校验阶段——不是网络、权限或镜像问题,而是 CLI 模式下某个 PHP 扩展根本没加载。必须逐层验证并补全,否则任何后续操作都无效。
怎么确认扩展真缺失,而不是误报
别信报错文字,也别猜,直接查 CLI PHP 实际加载状态:
- 运行
php -r "var_dump(extension_loaded('zip'));"(对 zip)或php -r "var_dump(class_exists('DOMDocument'));"(对 dom),输出bool(false)才坐实缺失 - 用
php --ini查清 CLI 真正读的是哪个php.ini,别改错文件(XAMPP/WAMP 常有多个php.ini) - 运行
php -m | grep -E "zip|gd|fileinfo|dom|mbstring|openssl|curl|xml"一次性扫多个关键扩展,漏一个都可能让composer install失败
Ubuntu/Debian、CentOS/RHEL、macOS、Windows 各自该装什么包
装错包名等于白干,且不同发行版命名规则完全不同:
- Ubuntu/Debian:
sudo apt install php-zip(自动启用)、sudo apt install php-gd、sudo apt install php-fileinfo;若提示找不到,加版本号如php8.2-zip - CentOS/RHEL 7:
sudo yum install php-pecl-zip(不是php-zip)、sudo yum install php-dom;RHEL 8+ 改用dnf install php-zip - Alpine(Docker):
apk add php8-zip(版本号必须匹配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 仍报错,大概率是以下某处断链:
立即学习“PHP免费学习笔记(深入)”;
- CLI 和 Web 服务器(如 Apache/Nginx)用了不同
php.ini,php --ini显示的路径才是你要改的那个 - Linux 下装了
php-zip,但没重启终端——新 shell 才会重新读取模块列表,旧终端里php -m仍缓存旧状态 - libzip 库太旧(如 CentOS 7 自带 0.10),PHP 8.0+ 要求 ≥ 1.6.0,即使
extension=zip加载成功,解压时也会崩溃;查版本:pkg-config --modversion libzip - Docker 中只装了
php8-zip,但没装系统级unzip命令(apk add unzip),Composer 默认优先调它,报 “unzip not found”
宝塔面板里 fileinfo 找不到或点了没反应怎么办
宝塔从 7.7 开始已内置 fileinfo 源码,95% 场景无需重编译:
- 登录宝塔 → 「软件商店」→ 找到你当前用的 PHP(如 PHP-80)→ 「设置」→ 「安装扩展」页 → 找到
fileinfo→ 点「安装」→ 务必点右上角「重载配置」 - 如果按钮卡在 99%,大概率是内存不足:宝塔默认限制单次扩展编译最多使用 512MB 内存;可先加 Swap(「Linux工具箱」→「Swap/虚拟内存」→ 添加 1024MB),或临时注释掉
/www/server/panel/class/common.py中的内存检查逻辑 - 验证 CLI 是否真加载:
php -m | grep fileinfo必须输出纯文本fileinfo;若无,检查php --ini显示的Loaded Configuration File路径下是否有extension=fileinfo.so(PHP 8.0+ 必须带.so)
最易被忽略的一点:CLI 和 FPM 的 php.ini 是两套独立配置,你在宝塔「PHP 设置」里看到的路径,通常是 FPM 用的;而 php --ini 显示的才是 Composer 真正在读的。改错文件,等于没改。



















