GuzzleのリクエストにプロキシIPを設定する
Guzzleのリクエスト単位のproxyオプションと、ハンドラー依存の接続タイムアウト、明示的な除外リストの扱いを説明します。
Guzzleのproxyオプションには、完全なエンドポイントURLを指定できます。その操作だけで選んだIPを使いたい場合は、リクエストに設定してください。
<?php
require __DIR__ . '/vendor/autoload.php';
$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'https://example.com/', [
'proxy' => 'http://203.0.113.10:8080',
'connect_timeout' => 5,
'timeout' => 15,
'http_errors' => false,
]);
echo $response->getStatusCode(), PHP_EOL;
echo (string) $response->getBody();
例はComposerでGuzzle 7をインストール済みであることを前提とします。文書用アドレスを契約先、またはHTTPプロキシ一覧の実際のHTTPプロキシに置き換えます。リクエストURLには接続先を残してください。プロキシは仲介役であり、ダウンロードするリソースそのものではありません。
ここではhttp_errorsをfalseにし、HTTPエラー応答も調査できるようにしています。接続失敗では引き続き転送例外が発生します。そのため、確立中に拒否されたHTTPSトンネルは、通常のサイト応答オブジェクトを受け取る前に失敗することがあります。
接続制限の挙動が違う場合はハンドラーを確認する
Guzzleは異なるHTTPハンドラーを使えます。文書によると、組み込みのcURLハンドラーはconnect_timeoutに対応します。独自ハンドラーやPHP cURLのない環境が同等とは限りません。コピーしたタイムアウト設定が効いていると思う前に、アプリが使うハンドラーを確認してください。
全体のtimeoutも設定する価値があります。無料リストの項目は確認と確認の間に応答しなくなる場合があり、既定値は迅速に終了する必要があるリクエストの期限には向いていません。
プロキシマップを使う
マップでは、接続先のスキームごとに経路を選び、プロキシを迂回するホストを明示できます。
'proxy' => [
'http' => 'http://203.0.113.10:8080',
'https' => 'http://203.0.113.10:8080',
'no' => [],
],
文字列オプションの代わりにこの配列を使います。HTTPSキーが選ぶのはHTTPSの接続先であり、HTTPの値は引き続きプロキシの待ち受け側を表します。待ち受けプロトコルが違うなら、エンドポイント設定も変える必要があります。
リクエストのproxyオプションを自分で渡す場合、必要なno値も自分で指定することをGuzzleは前提とし、NO_PROXYから自動コピーしません。空リストは切り離したプロキシテストに役立ちます。意図的な迂回ルールを持つアプリでは、そのルールを明示的に保持してください。