Guzzle 是 PHP 的一个HTTP客户端,GitHub上现在的 star 数为 2.35万(截止 2026 年 4 月 7 日)。
这里讲 Guzzle 怎么设置代理。
Guzzle 本身对代理的支持非常完善,提供了两种方式,一种是直接在构造函数里通过 request-options 配置,另一种是通过 Middleware 在请求流中动态注入代理逻辑。
如果你的代理配置是固定的,比如只需要对接一个代理服务商的单一节点,直接在实例化 Client 时把 proxy 参数塞进去就够了。核心代码如下:
$client = new Client([
'proxy' => [
'http' => 'http://user:pass@host:port',
'https' => 'http://user:pass@host:port',
],
'verify' => false,
'timeout' => 30
]);
这段配置里有几个值得注意的点。proxy 数组的 key 分别对应 http 和 https 两种协议,Guzzle 会根据目标 URL 的协议自动选择对应的代理地址。代理地址本身遵循一个固定的格式,`
但如果你需要对每个请求做拦截处理,比如根据目标域名动态选择代理节点,或者实现 IP 轮换逻辑,request-options 就不够用了。这时候需要用 Middleware 接管请求流,把代理选择逻辑注册到 HandlerStack 中。
$stack = HandlerStack::create();
$stack->push(function (callable $handler) {
return function (RequestInterface $request, array $options) use ($handler) {
// 在这里动态指定代理地址,比如从蜻蜓代理的私密代理的 API 实时拉取
$options['proxy'] = 'http://user:pass@host:port';
return $handler($request, $options);
};
});
Middleware 的核心思路是通过 HandlerStack 注册一个请求拦截器,在每个请求发出之前动态修改其代理属性。这种方式把代理选择的逻辑从静态配置变成了可编程的运行时行为,灵活度远高于 request-options。一方面你可以在拦截器里实现按域名分流的策略,另一方面还能在同一个 Client 实例中复用不同的代理池。
在实际采集中,单纯配置代理还不够。固定的代理 IP 用久了同样会被识别和封锁,所以我们在生产环境引入了动态代理机制。每次请求通过 API 获取一个新的出口 IP,从源头规避 IP 维度的检测。我们目前用的是蜻蜓代理的私密代理IP 服务,每次请求自动分配不同 IP,省去了自己维护 IP 池的成本。
除了 IP 切换,高并发下的**连接复用(Keep-Alive)**也是关键。一个优秀的代理通道能有效支撑起 Guzzle 的并发请求,在高频采集时减少 TCP 握手的开销,配合蜻蜓代理的国内高速网络,能让响应延迟大幅降低。
常见问题:
禁用 SSL 验证会不会有安全隐患? 代理服务器在转发 HTTPS 请求时会重新签发证书,Guzzle 的默认证书校验会识别到证书不匹配并拒绝连接。设置 verify => false 可以跳过这一校验,但建议仅在代理通道可信的环境下使用。
转载请注明
- 蜻蜓代理 - Guzzle代理配置
- 头条号 - 蜻蜓软件
- 微信公众号:蜻蜓软件(qingtingsoft)

