PHP cURL アプリケーションで「プロキシを取得する」と言っても、3 つの異なる意味があります。別のリクエストを追加する前に、どの観測が必要かを決めてください。

問いどこを見るか
アプリケーションはどのエンドポイントを設定したかハンドルに渡した設定
この転送でプロキシは使われたか対応している場合の転送情報
ウェブサイトはどの公開アドレスを見たかその宛先での観測

選択したエンドポイントはハンドルやリクエストオブジェクトと一緒に保持する。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 確認用エンドポイントは 3 つ目の問いに答える。その応答はプロキシ背後の出口を説明できますが、設定したホスト名は別の入口に解決されます。アプリケーションの設定で一方のアドレスを他方で置き換えるべきではありません。

関連記事