Composer诊断遇curl error 28超时,求排查解决方法
Composer curl error 28超时排查方案(浏览器/独立curl可正常访问场景)
针对你遇到的Composer执行diagnose时报curl error 28超时,但浏览器和单独curl命令能正常访问目标地址的情况,按以下步骤排查:
1. 验证端口连通性
直接测试目标域名的443端口是否可访问:
- 在PowerShell执行:
Test-NetConnection repo.packagist.org -Port 443 Test-NetConnection api.github.com -Port 443 - 查看输出中的
TcpTestSucceeded字段:- 若为
False,说明ISP或本地防火墙封禁了443端口; - 若为
True,则端口无问题,排查其他原因。
- 若为
2. 检查PHP与系统cURL的配置差异
系统curl和PHP的cURL可能使用不同配置,导致行为不一致:
- 执行
php -i | findstr /i curl查看PHP的cURL配置,重点关注:curl.cainfo:是否配置了有效的CA证书路径(Windows下未配置可能引发SSL验证超时);curl.proxy_host/curl.proxy_port:是否残留无效代理配置。
- 对比系统curl配置(执行
curl --config),确认代理、CA证书等关键配置是否一致。
3. 用PHP脚本追踪cURL请求细节
编写测试脚本test_curl.php,获取详细的cURL请求日志:
<?php $ch = curl_init('https://repo.packagist.org/packages.json'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_VERBOSE, true); $verboseLog = fopen('php://temp', 'w+'); curl_setopt($ch, CURLOPT_STDERR, $verboseLog); $response = curl_exec($ch); $errorNo = curl_errno($ch); $errorMsg = curl_error($ch); rewind($verboseLog); $verboseContent = stream_get_contents($verboseLog); echo "错误代码: $errorNo\n"; echo "错误信息: $errorMsg\n"; echo "详细日志:\n$verboseContent\n"; curl_close($ch); ?>
执行php test_curl.php,根据日志判断是DNS解析慢、SSL握手超时还是连接阶段超时。
4. 排查DNS解析差异
确认系统和PHP使用的DNS解析结果是否一致:
- 命令行执行
nslookup repo.packagist.org记录IP; - 在测试脚本中添加以下代码并执行:
<?php var_dump(gethostbyname('repo.packagist.org')); ?> - 若两者IP不同,说明PHP使用的DNS服务器异常,可修改php.ini的
dns配置或本地DNS服务器。
5. 临时禁用SSL验证测试(仅用于排查)
在test_curl.php中添加以下代码后重新执行:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
若请求成功,说明是CA证书验证问题,需在php.ini中配置curl.cainfo为有效证书路径。
6. 清除Composer代理配置
若存在无效代理配置,会导致请求超时:
- 执行以下命令清除全局代理:
composer config -g --unset http-proxy composer config -g --unset https-proxy - 再执行
composer diagnose测试。
7. 切换Composer镜像源
尝试切换到国内镜像,排除原源的网络波动:
- 执行:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 重新执行
composer diagnose验证。
内容的提问来源于stack exchange,提问作者Muath Alsowadi
相关产品推荐
相关产品推荐

