使用AWS官方PHP SDK连接S3报错:连接被拒绝
排查PHP AWS SDK连接S3时的"Connection refused"错误
可能的原因及解决方法
1. 代理配置缺失
C# SDK可能自动读取了系统代理设置,但PHP SDK默认不会。如果你的环境需要通过代理访问外网,需要在S3Client配置中添加代理参数:
$s3Client = new S3Client([ 'version' => '2006-03-01', // 建议指定具体版本而非latest 'region' => 'us-east-1', 'credentials' => [ 'key' => 'your-access-key', 'secret' => 'your-secret-key', ], 'http' => [ 'proxy' => 'http://your-proxy-host:port', // 如果代理需要认证,添加以下两行 'proxy_user' => 'proxy-username', 'proxy_pass' => 'proxy-password', ], ]);
2. PHP cURL扩展问题
- 检查cURL扩展是否开启:在PHP代码中执行
var_dump(extension_loaded('curl'));,返回bool(true)才是正常。如果未开启,修改php.ini启用extension=curl。 - 检查cURL是否支持TLS 1.2+:执行
curl -V查看输出,确保SSL版本包含TLSv1.2或更高。S3要求使用TLS 1.2及以上版本,旧版cURL可能无法建立连接。
3. 指定具体的SDK版本
使用'version' => 'latest'可能引入兼容性问题,AWS官方建议指定具体的API版本,比如S3常用的2006-03-01,替换代码中的latest即可。
4. 显式指定S3端点
虽然us-east-1的默认端点是s3.amazonaws.com,但可以显式指定端点来排除区域配置问题:
$s3Client = new S3Client([ 'version' => '2006-03-01', 'region' => 'us-east-1', 'credentials' => [ 'key' => 'your-access-key', 'secret' => 'your-secret-key', ], 'endpoint' => 'https://s3.us-east-1.amazonaws.com', ]);
5. 防火墙或安全软件拦截
检查本地防火墙、杀毒软件或企业安全策略是否阻止了PHP进程访问s3.amazonaws.com。可以尝试在命令行用PHP执行简单的curl请求测试:
<?php $ch = curl_init('https://s3.amazonaws.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); if(curl_errno($ch)) { echo 'Curl error: ' . curl_error($ch); } curl_close($ch);
如果命令行返回连接拒绝,说明是网络拦截问题,需要调整安全软件规则或联系管理员。
6. 验证凭证正确性
虽然C#能正常连接,但还是要确认PHP代码中填写的Access Key和Secret Key是否正确,避免复制粘贴时出现空格或特殊字符。
内容的提问来源于stack exchange,提问作者Stiven Diplet
相关产品推荐
相关产品推荐

