Composer install卡住主因是TLS握手失败而非超时,常见于Windows旧cURL或macOS证书路径错误;需先用curl -v验证,再检查php.ini中openssl.cafile路径是否正确且证书文件有效。

为什么composer install卡住不报错,但实际是SSL超时?
这不是网络慢或包大导致的常规超时,而是 TLS 握手阶段失败后被静默重试,最终触发 process-timeout(默认 300 秒)并报错 Failed to enable crypto 或直接卡在 Updating dependencies。常见于 Windows 上 PHP 自带旧版 cURL(如 7.64.1),或 macOS 更新后 OpenSSL 与系统证书路径脱节。
先确认是不是真超时,还是握手失败
运行 curl -v https://packagist.org/packages.json:
- 如果也卡住或返回
curl: (35) SSL connect error或SSL routines:ssl3_read_bytes:sslv3 alert handshake failure→ 是 TLS 协商失败,不是超时 - 如果返回
HTTP/2 200且很快 → 真是 Composer 层级超时,可调process-timeout - 若
curl成功但composer install卡住 → 大概率是代理劫持或 PHP 的openssl.cafile未覆盖 MITM 根证书
调整 process-timeout 只治标,且需配合证书修复
process-timeout 控制的是 Composer 下载单个文件的最大等待时间,不是 TLS 连接建立时间。它对握手失败无效,仅对已建立连接但响应慢的场景有用:
- 临时加长:运行
composer config -g process-timeout 600 - 单次生效更安全:用
COMPOSER_PROCESS_TIMEOUT=600 composer install - 注意:如果根本连不上 packagist.org,调这个值毫无意义;必须先解决
openssl.cafile和curl.cainfo配置
Windows/macOS 下最常漏掉的一步:证书路径用了单反斜杠
在 php.ini 中写路径时,C:phpcacert.pem 是错的 —— 单反斜杠会被 PHP 当作转义符,变成 C:phpcacert.pem,文件根本打不开:
- 正确写法一(推荐):
openssl.cafile="C:/php/cacert.pem"(统一用正斜杠) - 正确写法二:
openssl.cafile="C:\php\cacert.pem"(双反斜杠) - 验证是否生效:运行
php -r "print_r(openssl_get_cert_locations());",看default_cert_file是否显示你写的路径,且文件存在、大小 >100KB
真正卡住的地方,往往不是 timeout 数值,而是 PHP 压根没读到证书文件 —— 路径写错、权限不足、文件损坏,三者占了八成以上。别急着调超时,先让 openssl_get_cert_locations() 说话。


















