那次 PHP multi-cURL 传输用的是哪个代理?
为每个 cURL 句柄保留代理元数据,并区分配置的路由与目标观测到的出口 IP。
multi-cURL 传输按各自的顺序完成。如果每个句柄分配了不同的代理,最先完成的结果不一定属于输入列表中的第一个代理。
在配置每个句柄时附加一个稳定的传输标识符。如果你正在测试可选的公共端点,HTTP 代理列表提供 HTTP 候选。PHP 公开了 libcurl 的私有数据机制:
$id = 'job-17';
curl_setopt($handle, CURLOPT_PROXY, 'http://203.0.113.10:8080');
curl_setopt($handle, CURLOPT_PRIVATE, $id);
curl_multi_info_read()报告某个传输已完成时,用返回的句柄恢复该标识符:
$id = curl_getinfo($message['handle'], CURLINFO_PRIVATE);
按该标识符保存一条应用记录,包含目标、配置的代理和尝试次数。即使重试属于同一个整体任务,通过另一个代理重试也应获得新的尝试记录。
把三种地址分开保存
配置的代理端点是提供给 cURL 的地址。连接的对方地址描述 cURL 打开的网络连接。目标观测到的出口 IP 是对方报告的信息。它们可能不同,尤其是在链式或提供商管理的代理下。
私有元数据记录你打算使用的配置,但无法证明目标看到了哪个 IP。反过来说,目标的 IP 响应不会自动告诉你程序中哪个句柄产生了它。
在常规日志中保存安全的代理标识符。如果完整端点包含凭据,为每次失败传输记录该 URL 会把密码扩散到整个错误收集里。
这个小小的记账步骤让混合结果更易读:一个任务、一次尝试、一个选定的代理和一个实际结果。它也避免依赖 PHP 基于资源与基于对象的 cURL API 之间发生变化的偶然句柄表示。