必须同时配置php.ini中的openssl.cafile和curl.cainfo且路径完全一致,因composer底层分别依赖openssl和curl发起https请求,二者读取不同配置项,仅配其一或路径不一致均会导致ssl证书验证失败。

php.ini 里 openssl.cafile 和 curl.cainfo 必须同时配且路径一致
Composer 底层用 OpenSSL(比如 file_get_contents)和 cURL(默认 HTTP 客户端)发起 HTTPS 请求,两者读取的证书配置项不同:openssl.cafile 控制前者,curl.cainfo 控制后者。只改一个?大概率仍报 SSL certificate problem: unable to get local issuer certificate。
常见错误操作包括:
- 路径写成相对路径(如
"cacert.pem"),PHP 找不到文件 - Windows 下用单反斜杠
"C:\php\cacert.pem",被当转义符解析失败 - 两个配置指向不同文件,或其中一个留空/注释掉
- 改了 php.ini 但没重启 CLI 环境(Windows 下尤其容易忽略)
正确做法:下载官方 cacert.pem(来源必须是 curl.se),存为绝对路径(如 /usr/local/etc/php/cacert.pem 或 C:/php/extras/ssl/cacert.pem),然后在 php.ini 中写:
openssl.cafile="/usr/local/etc/php/cacert.pem" curl.cainfo="/usr/local/etc/php/cacert.pem"
别信 composer config --global cafile,它基本不生效
这条命令设置的 cafile 只影响 Composer 自封装的 HTTP 驱动(如 php-http),而实际触发错误的往往是底层 cURL 或 OpenSSL 调用——它们完全不读这个配置。
现象就是:明明执行了 composer config -g cafile "/path/to/cacert.pem",依然报 cURL error 60 或 certificate verify failed。
验证方式很简单:
- 运行
php -r "print_r(openssl_get_cert_locations());",看default_cert_file和ini_cafile是否指向你期望的路径 - 如果输出里
ini_cafile是空、null或路径不对,说明 php.ini 没生效,或者你编辑的是错的 php.ini
composer config -g repo.packagist 静默失效的三个硬性条件
换国内镜像源(如阿里云)时,composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 经常“看起来成功了,其实没用”。根本原因是它必须同时满足:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 键名必须是
repo.packagist(单数,不能是repos.packagist或repositories) -
type值必须显式写为"composer"(不能省略) - URL 必须以
/结尾(https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌)
验证是否真生效,只看这一条命令输出:
composer config -g repo.packagist
正确结果必须是完整 JSON 对象,例如:
{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}
如果输出是 null、空字符串、或还是 https://packagist.org,说明配置根本没写进去。
清缓存比换源更重要:Content-Length mismatch 很可能来自坏缓存
遇到 Content-Length mismatch 错误,第一反应不是换源,而是清缓存。Composer 会把 zip 包缓存在 ~/.composer/cache/files/ 下,一旦上次下载中断导致文件残缺,下次安装就会复用这个坏文件并校验长度失败。
这时候重试、换源、关 TLS 都没用。
安全操作顺序是:
- 先运行
composer clear-cache - 确认
~/.composer/cache/files/目录为空 - 再执行
composer install --retry=3
注意:composer clear-cache 不影响 vendor/ 或 composer.lock,可放心执行。










