这个 PHP cURL 请求用了哪个代理?
区分配置的代理、实际连接的对方地址,以及目标站点看到的公网出口。
在 PHP cURL 应用里,“拿到代理”可能指三件不同的事。在再加一个请求之前,先确定你需要哪一种观测。
| 问题 | 该看哪里 |
|---|---|
| 应用配置了哪个端点? | 传给句柄的配置 |
| 这次传输是否用了代理? | 传输信息(在支持的情况下) |
| 网站看到了哪个公网地址? | 在该目标处的一次观测 |
把选定的端点与句柄或请求对象放在一起。curl_getinfo 是传输信息的接口,并不是能取回每个先前赋值的 CURLOPT 值的通用取值器。保留应用侧配置,比试图拦截 curl_setopt 调用简单。
检查已完成的传输
传输结束后,可以通过 CURLINFO_PRIMARY_IP 取得已连接的对方地址。当第一个连接指向代理时,这个对方地址可能是代理的地址,而不是网站的地址。
$peer = curl_getinfo($ch, CURLINFO_PRIMARY_IP);
$usedProxy = defined('CURLINFO_USED_PROXY')
? curl_getinfo($ch, constant('CURLINFO_USED_PROXY'))
: null;
CURLINFO_USED_PROXY 在 8.7.0 加入 libcurl,并由兼容的 PHP 构建提供。它的结果只报告是否用了代理,不是所选代理的完整 URL。如果该常量不可用,上面的 null 表示观测不可用,并不表示请求是直连的。
要在句柄仍描述该次操作时读取这些值。失败的连接可能给不出有用的对方地址;即使显式配置了代理,也可能被适用的排除规则绕过。
一个 IP 检查端点回答第三个问题。它的回答可以描述代理后面的出口,而配置的主机名可能解析到另一个入口。在应用设置里,不应把两个地址互相替换。