为 Guzzle 请求设置代理 IP
使用 Guzzle 的单次请求 proxy 选项,并理解依赖处理器的连接超时及显式绕过列表行为。
Guzzle 的 proxy 选项接受完整的端点 URL。如果只有这次操作应使用选定 IP,就在该请求上设置它。
<?php
require __DIR__ . '/vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://example.com/', [
'proxy' => 'http://203.0.113.10:8080',
'connect_timeout' => 5,
'timeout' => 15,
'http_errors' => false,
]);
echo $response->getStatusCode(), PHP_EOL;
echo (string) $response->getBody();
示例假定已通过 Composer 安装 Guzzle 7。将文档示例地址换成服务商或HTTP 代理列表提供的实际 HTTP 代理。请求 URL 仍应保留目标地址:代理是中间环节,并非要下载的资源。
这里将 http_errors 设为 false,使 HTTP 错误响应仍可供检查。连接失败仍会抛出传输异常。因此,在建立阶段被拒绝的 HTTPS 隧道可能在你收到普通网站响应对象之前就失败。
连接时限表现不同时,检查处理器
Guzzle 可以使用不同的 HTTP 处理器。其文档说明内置 cURL 处理器支持 connect_timeout。自定义处理器或没有 PHP cURL 的环境不一定等同。不要直接认定复制来的超时选项已经生效,应先检查应用实际使用的处理器。
整体 timeout 也值得设置。免费列表中的记录可能在两次检查之间停止响应,而默认值并不适合作为必须及时完成的请求期限。
使用代理映射
映射可按目标 URL 的协议方案选择路由,并显式提供绕过代理的主机:
'proxy' => [
'http' => 'http://203.0.113.10:8080',
'https' => 'http://203.0.113.10:8080',
'no' => [],
],
用此数组替代字符串选项。HTTPS 键选择 HTTPS 目标,其 HTTP 值仍描述代理监听端。监听协议不同,就需要不同的端点配置。
自行提供请求的代理选项时,Guzzle 要求你提供需要的 no 值,而不会自动从 NO_PROXY 复制。空列表适合隔离的代理测试。如果应用有刻意设置的绕过规则,则应显式保留这些规则。