PHP cURLでプロキシIPを使う
PHP cURLのハンドルにHTTPまたはSOCKSプロキシを設定し、サイトのURLを分け、転送エラーとHTTP応答を区別します。
Webサイトはcurl_init()に指定し、そのハンドルに中継先を設定します。PHPにはcURL拡張が必要です。端末でcurl実行ファイルが動いても、拡張が使える証拠にはなりません。
<?php
$ch = curl_init('https://example.com/');
curl_setopt_array($ch, [
CURLOPT_PROXY => 'http://203.0.113.10:8080',
CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
CURLOPT_NOPROXY => '',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 15,
]);
$body = curl_exec($ch);
if ($body === false) {
throw new RuntimeException(curl_error($ch), curl_errno($ch));
}
echo curl_getinfo($ch, CURLINFO_RESPONSE_CODE), PHP_EOL;
echo $body;ドキュメント用のIPとポートを、自分のHTTPプロキシまたはHTTPプロキシ一覧の項目に置き換えます。CURLOPT_NOPROXYはこのテスト用に迂回ルールを消し、CURLOPT_RETURNTRANSFERは本文をブラウザに出力せず返します。接続の制限時間は接続確立を、全体のタイムアウトはcURL処理を制限します。
SOCKS5の接続先を使う場合は、curl_exec()の前にHTTPプロキシのオプションを置き換えます。
curl_setopt($ch, CURLOPT_PROXY, '203.0.113.10:1080');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);CURLPROXY_SOCKS5_HOSTNAMEは宛先のDNSをSOCKSサーバーに委ねます。明示されたプロトコルを使ってください。ポート1080だけでは判別できません。どちらのプロキシを選んでも、サイトの証明書検証を無効にする必要はありません。
$body === falseを厳密に判定してください。本文が空でも転送は成功している場合があります。一方、サイトからの応答が存在する前にトンネルが失敗することもあります。逆に、本文があっても403、404、429の場合があります。CURLINFO_RESPONSE_CODEとcURLのエラー結果を合わせて読み、完了したリクエストが目的を果たしたか判断します。