确认缺 zip 扩展需先查 composer 调用的 php 路径(composer diagnose),再用 php -r "echo class_exists('ziparchive') ? 'ok' : 'missing';" 验证;若 missing,则按系统安装对应扩展并确保 cli 加载正确 php.ini。

确认是不是真缺 zip 扩展,别被表象骗了
报 The zip extension is missing 或 requires ext-zip,不等于系统没装 zip.so,更常见的是 CLI 模式 PHP 没加载它,或者你用的其实是另一个 PHP(比如 sudo 下的 root 环境)。
先查清楚 Composer 调用的是哪个 PHP:composer diagnose 里看 PHP binary 路径;再直接验证:php -r "echo class_exists('ZipArchive') ? 'OK' : 'Missing';"
比 php -m | grep zip 更可靠——因为模块名大小写、拼写误差都可能漏判。
如果返回 Missing,说明 ZipArchive 类确实不可用,得继续往下走。
Linux 各发行版安装 zip 扩展的实操差异
Ubuntu/Debian:sudo apt install php-zip(自动启用,不用改 php.ini)
但如果你用了多版本 PHP(如 PHP 8.2),得明确指定:sudo apt install php8.2-zip
CentOS/RHEL 8+:sudo dnf install php-zip
CentOS/RHEL 7:sudo yum install php-pecl-zip(注意是 pecl-zip,不是 php-zip)
Alpine(Docker 常见):apk add php8-zip(按实际 PHP 版本选 php7-zip 或 php8-zip)
装完必须新开终端或重新登录 shell——否则 php -m 还是旧环境。
手动启用 zip 扩展的三种典型场景
有些情况装完也不生效,得手动干预:
• Homebrew macOS:装了 php@8.1-zip,但 php.ini 里没加 extension=zip,得自己补上
• 编译安装的 PHP:zip.so 在 /usr/local/lib/php/extensions/...,但 php.ini 没指向它,要用绝对路径:extension=/usr/local/lib/php/extensions/no-debug-non-zts-20220829/zip.so
• Docker 或精简镜像:extension_dir 配错了,或 zip.so 根本不在默认扩展目录,得先 find /usr -name "zip.so" 2>/dev/null 定位
所有修改后都不用重启服务,但务必运行 php --ini 确认 CLI 加载的是你改的那个 php.ini,而不是 /etc/php/*/cli/conf.d/ 下某条覆盖配置。
Windows 和多环境共存时最容易忽略的点
Windows 用户常以为取消 ;extension=zip 就完事了,其实两个坑藏得深:
• XAMPP/WAMP 有两套 php.ini:Apache 用一份,CLI(命令行)用另一份,php --ini 显示的路径才是 Composer 真正读的
• php_zip.dll 文件可能根本不存在——尤其重装过 PHP 或用了绿色版,得检查:dir "C:\xampp\php\ext\php_zip.dll"(路径按你实际 PHP 目录替换)
如果文件缺失,不能只改配置,得重装对应版本的 PHP 安装包,或从官方二进制包里手动复制 DLL
Mac/Linux 上也类似:Web 用的 PHP-FPM 和 CLI 用的 PHP 可能加载不同 php.ini,phpinfo() 页面看到 zip 启用 ≠ Composer 能用。











