在 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 检查端点回答第三个问题。它的回答可以描述代理后面的出口,而配置的主机名可能解析到另一个入口。在应用设置里,不应把两个地址互相替换。

相关文章