使用Guzzle requestAsync调用同服务器API遇SSL证书错误求助
解决Guzzle异步调用同域名API时的SSL证书错误
问题场景
使用Guzzle的async并发调用同一域名(https://test.local)下的两个API时,抛出cURL error 60: SSL certificate problem: self-signed certificate错误,但常规同步调用、调用其他域名API均正常,且已在php.ini中配置curl.cainfo指向有效证书文件。
解决方案
1. 显式指定Guzzle的SSL验证证书路径
Guzzle异步请求可能未自动读取php.ini中的curl.cainfo配置,需在Client实例化时显式传入verify参数指定证书路径:
$params = []; $client = new Client([ 'base_uri' => 'https://test.local', 'cookies' => true, 'verify' => 'C:\laragon\etc\ssl\cacert.pem' // 替换为你的证书实际路径 ]); $promises = [ 'first' => $client->requestAsync($method, '/api/first', ['form_params' => $params]), 'second' => $client->requestAsync($method, '/api/second', ['form_params' => $params]), ]; $responses = Utils::unwrap($promises);
2. 开发环境临时关闭SSL验证(生产环境禁用)
如果是本地开发测试,可以临时关闭SSL验证(绝对不要在生产环境使用):
$client = new Client([ 'base_uri' => 'https://test.local', 'cookies' => true, 'verify' => false ]);
3. 将本地自签名证书加入信任列表
如果test.local使用的是自签名证书,需要将该证书内容追加到C:\laragon\etc\ssl\cacert.pem文件末尾,然后重启Web服务器和PHP服务,确保Guzzle能识别该自签名证书。
原因说明
Guzzle异步请求依赖的底层事件循环实现,可能不会自动加载php.ini中配置的全局cURL证书,因此需要显式指定证书路径,或确保本地自签名证书已被包含在信任证书集合中。
内容的提问来源于stack exchange,提问作者Amit Shah
相关产品推荐
相关产品推荐

