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 复制。空列表适合隔离的代理测试。如果应用有刻意设置的绕过规则,则应显式保留这些规则。

相关文章