答案是PHP CLI未加载openssl扩展,需用php --ini确认真实php.ini路径,取消extension=php_openssl.dll注释、校验extension_dir及DLL文件存在性,并重启终端验证。

php -m 里看不到 openssl 就别装 Composer
Composer 报这个错,根本不是 Composer 的问题,而是 PHP CLI 环境压根没加载 openssl 扩展。Windows 下最常见的情况是:你改了某个 php.ini,但 composer 实际调用的不是那个文件。
先确认当前 CLI 真实生效的配置路径:php --ini
输出里 “Loaded Configuration File” 那一行才是关键。别凭记忆去改 C:\xampp\php\php.ini,如果这行显示的是 C:\php\php.ini,那前面那个就是白改。
检查是否真没开:php -m | findstr openssl
没输出?说明扩展确实没加载。此时再查 php.ini 里有没有这行:extension=php_openssl.dll
注意两点:
- 必须取消开头的分号(
;extension=php_openssl.dll→extension=php_openssl.dll) -
extension_dir必须指向正确的ext目录,比如extension_dir = "ext"或绝对路径extension_dir = "C:\php\ext",且该目录下真有php_openssl.dll
中文用户名导致 composer global 命令失效
哪怕 php -m 显示 openssl 已加载,composer global require laravel/installer 成功,但敲 laravel -V 仍报“不是内部或外部命令”,大概率是 COMPOSER_HOME 落在中文路径下(如 C:\Users\张三\AppData\Roaming\Composer)。
Windows 的批处理包装器(composer.bat)和某些 shell 对中文路径解析不稳定,bin 目录注册会静默失败。
临时解决方法(推荐):
在 CMD 或 PowerShell 中执行:set COMPOSER_HOME=C:\composer-home
然后再运行 composer global require。之后把 C:\composer-home\vendor\bin 加进系统 PATH。
长期方案:
修改系统环境变量,新增 COMPOSER_HOME 指向纯英文路径,比如 C:\Users\John\Composer,并确保该路径不存在中文字符。
阿里云镜像不能绕过 openssl 缺失
有人以为换源就能跳过证书校验,其实不行。composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 只是把 HTTPS 请求发往阿里云镜像站,依然需要 openssl 支持 TLS 握手。没有它,连 DNS 解析后建立连接这一步都卡住。
更危险的操作是临时禁用 SSL:composer config -g secure-http false
这会让 Composer 允许 HTTP 源,但现代 Packagist 已强制 HTTPS,且阿里云镜像也只提供 HTTPS 接入,所以这招实际无效,还可能引发其他报错。
真正有效的加速手段只有两个:
- 确保
openssl已启用 + 使用阿里云 HTTPS 镜像(默认就走 HTTPS) - 如果网络本身对 TLSv1.2 支持弱(比如老旧企业防火墙),可尝试升级 PHP 到 8.1+,它们默认使用更健壮的 OpenSSL 库绑定
extension=openssl 和 extension=php_openssl.dll 不是一回事
Linux/macOS 下写 extension=openssl 即可,因为扩展名自动补 .so;但 Windows 必须写全名 extension=php_openssl.dll,否则 PHP CLI 启动时找不到文件,也不会报错,只是静默忽略。
另外,新版 PHP(8.0+)依赖 OpenSSL 1.1.1 或更高版本,旧版 WAMP/XAMPP 自带的 OpenSSL DLL(如 ssleay32.dll)已废弃。若你看到类似 The OpenSSL library (0.9.8zb) used by PHP does not support TLSv1.2 的提示,说明 DLL 版本太老,必须替换为新版 PHP 官方包附带的 DLL,或直接换用官方二进制包(如 windows.php.net 下载的 Thread Safe 版)。
验证是否真用上新库:php -i | findstr "OpenSSL Library"
应输出类似 OpenSSL Library => OpenSSL 3.0.13,而不是 0.9.8 或空。


















