PHP CLI环境缺失curl扩展导致Composer报错,需先用php -m | grep curl验证是否加载,再通过php --ini定位正确php.ini文件并启用extension=curl,Linux按发行版安装对应包(如Ubuntu用php-curl、CentOS用php-curl),Windows确认php_curl.dll及依赖DLL存在且extension_dir路径正确,最后重启终端并用php -r验证功能可用。

PHP CLI 环境没加载 curl 扩展
Composer 是 PHP 脚本,运行时依赖 PHP CLI 的扩展能力。报“curl extension is required”或类似提示,说明 php -m 输出里没有 curl,不是 Composer 自己的问题,而是 PHP 命令行根本没启用它。
- 先验证:运行
php -m | grep curl(Linux/macOS)或php -m | findstr curl(Windows),若无输出,确认缺失 - 再查配置:执行
php --ini看加载的是哪个php.ini,别改错文件(Web 和 CLI 的php.ini常不同) - 编辑该
php.ini,取消注释这行:extension=curl;Windows 下注意路径是否匹配extension_dir,比如extension_dir="C:\php\ext" - 改完必须重启终端——旧 CMD/PowerShell 进程不读新配置,
where php和php -v也要核对是否指向你刚配的 PHP
Linux 下 curl 扩展包名因发行版而异
Debian/Ubuntu 和 CentOS/RHEL 的 PHP 扩展包命名规则不同,直接 apt install php-curl 或 yum install php-curl 可能失败,得看 PHP 版本和仓库源。
- Ubuntu 22.04+ / Debian 12+:用
sudo apt install php-curl(自动匹配当前 PHP 版本) - CentOS 7:用
sudo yum install php-curl;CentOS 8+/AlmaLinux/Rocky:用sudo dnf install php-curl - 如果系统装了多个 PHP(如 php8.1、php8.2),需指定版本:Ubuntu 下是
php8.2-curl,RHEL 系是php82-php-curl(取决于 SCL 或 Remi 仓库) - 装完别忘了重启 PHP-FPM 或 Apache,但 Composer 只用 CLI,所以重点验证
php -m是否生效
Windows 下 extension=php_curl.dll 加载失败的典型原因
Windows 用户常遇到明明写了 extension=php_curl.dll 却仍报错,问题多出在 DLL 依赖或路径上。
-
php_curl.dll依赖libssh2.dll和ssleay32.dll(或新版libssl-3-x64.dll),这些文件必须放在php.exe同目录,或系统PATH路径中 - 检查
php.ini中extension_dir是否指向真实存在的目录,且该目录下确有php_curl.dll文件 - 如果用的是非官方 PHP(如 XAMPP、WAMP),优先用它们自带的「PHP 扩展开关」图形界面启 curl,比手改
php.ini更可靠 - 运行
php -r "echo curl_version()['version'];",能输出版本号才算真正可用;只靠php -m显示 curl 不代表功能正常
容器或 CI 环境里 curl 扩展看似存在实则不可用
Docker 镜像(尤其 Alpine)或 CI runner(如 GitHub Actions Ubuntu-latest)可能预装了 curl 扩展,但 OpenSSL 支持不全,导致 Composer 在 TLS 握手阶段静默失败,错误日志里却只显示“curl extension missing”这类误导信息。
- Alpine 镜像应避免用
apk add php82-curl,改用完整 PHP 包:apk add php82 php82-curl php82-openssl,并确认php82-openssl已加载 - GitHub Actions 中 Ubuntu runner 默认 PHP 不含 curl?加一步安装:
sudo apt-get update && sudo apt-get install -y php-cli php-curl - 最简验证法:在容器或 CI 步骤里插入
php -r '$ch = curl_init("https://packagist.org"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); echo curl_exec($ch);',能输出 HTML 片段才真可用 - 别信
docker exec -it xxx php -m | grep curl的输出——它只说明模块注册了,不保证网络栈就绪
实际修复时,最容易被忽略的是 CLI 和 Web SAPI 使用不同 php.ini,以及 Windows 下 DLL 依赖缺失——这两处问题不会报明确错误,只会让 curl 在 Composer 运行时“假装存在,实际失能”。











