PHP で外部のデータを取得する(プロキシ経由)

前に file_get_contents() 関数を使ったネタを書きましたが 社内などでプロキシを経由している場合は エラーになってしまいます。

プロキシの接続情報を含め、追加情報を設定するには 第 3 引数にコンテキストを設定します。

echo file_get_contents('http://www.yahoo.co.jp/', FALSE, $context); 

コンテキストを作成するには stream_context_create() 関数を使います。

[参考]
PHP: stream_context_create - Manual

HTTP の場合次のようにすると POST 送信になります。

$context = stream_context_create(
  array(
    "http" => array(
      "method" => "POST",
    )
  ));

設定できるパラメータはマニュアルを参照してください。

[参考]
PHP: コンテキストオプションとパラメータ - Manual

プロキシの設定は次のように tcp://host:port で指定します。

$context = stream_context_create(
  array(
    "http" => array(
      "proxy" => "tcp://192.168.1.200:3128",
      "request_fulluri" => TRUE,
    )
  ));

プロキシ経由の場合 request_fulluri も指定します。

プロキシにユーザ認証がある場合ですが ネットで検索したら proxy_user, proxy_pass を設定するとありました。

$context = stream_context_create(
  array(
    "http" => array(
      "proxy" => "tcp://192.168.1.200:3128",
      "request_fulluri" => TRUE,
      "proxy_user" => "xxxxx",
      "proxy_pass" => "yyyyy",
    )
  ));

[参考]
プロキシ経由でfile_get_contents - Road To Nowhere

ただ、この方法では自分の環境では認証エラーになってしまいました。 仕方ないので 次のように プロキシ用のヘッダを生成して使用しています。 自分の環境のプロキシは Basic schema なので Base64 でエンコードするだけです。

$url = "http://www.google.co.jp/";

$proxy_host = "192.168.1.200";
$proxy_port = "3128";
$proxy_user = "xxxxx";
$proxy_pass = "yyyyy";
$proxy_auth = base64_encode("$proxy_user:$proxy_pass");

$context = stream_context_create(
  array(
    "http" => array(
      "proxy" => "tcp://$proxy_host:$proxy_port",
      "header" => "Proxy-Authorization: Basic $proxy_auth",
      "request_fulluri" => TRUE,
      )
  ));

echo file_get_contents($url, FALSE, $context);

Google サイト内検索

Amazonアソシエイト