Windows控制台运行PHP用Guzzle请求报ConnectException连接被拒绝如何解决
问题触发原因
- 代理配置不统一:Chrome浏览器通常会继承系统代理或者单独配置了代理规则,而Windows控制台运行的PHP进程默认不会读取浏览器的代理配置,直连请求被目标站点拒绝
- HTTPS证书校验失败:Windows官方发布的PHP压缩包默认没有内置根CA证书,Guzzle发起HTTPS请求时无法校验服务端证书合法性,会主动中断连接
- 反爬策略拦截:Guzzle默认的请求头User-Agent特征明显,很容易被站点的反爬规则识别拦截,Chrome的浏览器标识则会被正常放行
- 本地安全规则限制:Windows防火墙或第三方安全软件可能对php.exe的出站网络请求做了限制,仅放行浏览器的网络请求
修复方案
临时快速验证方案
修改Guzzle初始化配置,加入代理、UA模拟、临时关闭证书校验的参数,代码如下:
$httpClient = new \GuzzleHttp\Client([ // 如不需要代理可删除该行,否则替换为你自己的代理地址 'proxy' => 'http://127.0.0.1:你的代理端口', // 临时关闭证书校验,仅测试用,生产环境不推荐 'verify' => false, // 模拟Chrome浏览器的User-Agent 'headers' => [ 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' ] ]); $response = $httpClient->get("https://example.com"); $htmlString = (string) $response->getBody();
生产环境规范修复方案
- 配置PHP全局根证书
- 下载官方cacert.pem根证书文件,放到PHP解压目录下的
extras/ssl文件夹中 - 打开PHP解压目录中的php.ini文件(如果没有就复制php.ini-development改名为php.ini)
- 找到
curl.cainfo和openssl.cafile两个配置项,去掉前面的分号注释,修改为证书的绝对路径,示例:
curl.cainfo = "C:\php-7.4.23-nts-Win32-vc15-x64\extras\ssl\cacert.pem" openssl.cafile = "C:\php-7.4.23-nts-Win32-vc15-x64\extras\ssl\cacert.pem"- 保存配置后,后续Guzzle请求不需要再设置
verify=false即可正常校验HTTPS证书
- 下载官方cacert.pem根证书文件,放到PHP解压目录下的
- 检查本地防火墙规则:打开Windows Defender防火墙的出站规则配置,确认php.exe的出站请求被允许,没有被安全软件拦截
内容的提问来源于stack exchange,提问作者Mathis Hüttl
相关产品推荐
相关产品推荐

