その 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);
その識別子をキーにしたアプリケーション記録を保持し、宛先、設定したプロキシ、試行番号を含めます。別のプロキシでの再試行は、同じ全体的なジョブに属していても、新しい試行記録に値します。
3 種類のアドレスを分けて保つ
設定されたプロキシのエンドポイントは cURL に渡されるアドレスです。接続のピアアドレスは cURL が開いたネットワーク接続を表します。宛先から見える出口 IP は相手側から報告される情報です。これらは異なることがあり、特に連鎖プロキシやプロバイダ管理のプロキシではそうです。
プライベートメタデータは意図した設定を記録しますが、宛先がどの IP を見たかを証明することはできません。逆に、宛先の IP 応答は、プログラムのどのハンドルがそれを生成したかを自動的に教えてくれるわけではありません。
通常のログには安全なプロキシ識別子を保存します。完全なエンドポイントに認証情報が含まれる場合、失敗した転送ごとにその URL を記録すると、パスワードがエラー収集全体に広がります。
この小さな記帳の手順により、混在した結果が読みやすくなります。1 つのジョブ、1 つの試行、1 つの選択されたプロキシ、1 つの実際の結果です。また、PHP のリソースベースとオブジェクトベースの cURL API の間で変わった偶然的なハンドル表現に依存することも避けられます。