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);

PHP の大文字・小文字

PHP の変数は大文字・小文字を区別します。
ところが予約語は、大文字・小文字の区別がありません。

次のようなスクリプトを記述します。
echo 命令が大文字・小文字の 2 パターンあります。

$a = "small";
$A = "large";

echo $a;
ECHO $a;
echo $A;
ECHO $A;

結果は次のようになります。
変数だけ大文字・小文字が区別されています。

small
small
large
large

関数(自作含む)なども大文字・小文字の区別はされません。

クラスの場合 メソッドは区別なしで、変数は区別ありとなります。

class Test {
    var $v1 = "abc";
    function f1() {
        return $this->v1;
    }
}

$t = new Test();
echo $t->f1();
echo $t->F1();
echo $t->v1;
echo $t->V1;   // この行だけエラー

Google サイト内検索

Amazonアソシエイト