Hatena::ブログ(Diary)

fm1202の日記

2010-12-10

CURLよりfile_get_contents()

PHP Advent Calendar jp 2010 10日目です。

Webサーバーから、JSONやXMLを取ってきたり、あるいはWebサーバーへそれらを投げたりする事がありますね。

自分はそういう時はCURL関数よりfile_get_contents()を使います。何といっても簡単で分かりやすい、と思っています。

function get($url, array $params = array(), array $headers = array()) {
  $queryString = http_build_query($params);
  if (strlen($queryString) > 0) {
    $url .= '?' . $queryString;
  }
  
  $header = implode("\r\n", $headers);
  $options = array(
    'http' => array(
      'method' => 'GET',
      'header' => $header
    )
  );
  
  $context = stream_context_create($options);
  
  return file_get_contents($url, false, $context);
}

function post($url, $params = array(), array $headers = array()) {
  if (is_array($params)) {
    $content = http_build_query($params);
  } else {
    $content = strval($params);
  }
  
  $defaultHeaders = array(
    'Content-type: application/x-www-form-urlencoded'
  );
  $headers = array_merge($defaultHeaders, $headers);
  $header = implode("\r\n", $headers);
  
  $options = array(
    'http' => array(
      'method' => 'POST',
      'header' => $header,
      'content' => $content
    )
  );
  
  $context = stream_context_create($options);
  
  return file_get_contents($url, false, $context);
}

こんな感じです。このままだと、get()はクエリストリングのある$urlに対応していないなど、色々と問題がありますが、実務で使う時は、クラス化してエラー処理を入れたりともう少し丁寧に書きます。

WebサービスAPIと通信を行う場合は、認証が必要な場合があります。4日目ご担当のredsnowさんが既に書いておられるのですが、IDとパスワードをbase64_encode()でエンコードしたAuthorization: Basic ヘッダを'header'に含めると、手軽にBasic認証をパス出来ます。

マニュアルはこちら。

Webサーバーにファイルをアップロードしたい場合は、CURLを使わないといけないでしょうか?

何もCURLに恨みがあるわけではないのですが、「便利な機能、好きなテクニック、興味のあるネタ」という事でfile_get_contents()についてエントリを書いてみました。皆さん、かなり高度な事を書いておられるのに簡単な内容で恐縮です。

明日はyuyakさんです。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/fm1202/20101210/1291945385
リンク元