PHP
curl

PHP cURLの色々な使い方

More than 3 years have passed since last update.

phpで外部のサイトにアクセスして様々な情報を取ってきたいときに有効なのがcURL関数。

HTTPリクエストで情報を取るのには、file_get_contentsという関数もあります。以下のようにすることでHTMLを簡単に取得することができます、しかし、リクエストヘッダーを変えたりするなど、リクエスト方法をカスタマイズするには限界があります、そういったカスタマイズを行いたい場合に有用なのがcURLです。しかし、しっかりした情報が少なくて自分が使うの時に苦労したので、様々な使い方をまとめておきます。


file_get_contents使い方

<?php

$url = "http://www.yahoo.co.jp/";
$html = file_get_contents($url);
var_dump($html);

以下からcURLの使い方をまとめていきます。

これで、HTMLが出力されます。


基本的な使い方

<?php

$url = "http://www.yahoo.co.jp/";
$ch = curl_init(); // はじめ

//オプション
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);
var_dump($html);
curl_close($ch); //終了


HTTP取得情報を確認する


HTTP情報

<?php

$url = "http://www.yahoo.co.jp/";
$ch = curl_init(); // はじめ

//オプション
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$info = curl_getinfo($ch);//この関数で取得
curl_close($ch); //終了

var_dump($info);
>>
array(22) {
["url"]=>
string(23) "http://www.yahoo.co.jp/"
["content_type"]=>
NULL
["http_code"]=>
int(0)
["header_size"]=>
int(0)
["request_size"]=>
int(0)
["filetime"]=>
int(0)
["ssl_verify_result"]=>
int(0)
["redirect_count"]=>
int(0)
["total_time"]=>
float(0)
["namelookup_time"]=>
float(0)
["connect_time"]=>
float(0)
["pretransfer_time"]=>
float(0)
["size_upload"]=>
float(0)
["size_download"]=>
float(0)
["speed_download"]=>
float(0)
["speed_upload"]=>
float(0)
["download_content_length"]=>
float(-1)
["upload_content_length"]=>
float(-1)
["starttransfer_time"]=>
float(0)
["redirect_time"]=>
float(0)
["certinfo"]=>
array(0) {
}
["redirect_url"]=>
string(0) ""
}


よく使うオプション


基本オプション

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//変数に保存する

curl_setopt($ch, CURLOPT_HEADER, true); // ヘッダも出力したい場合

proxy接続を行う


proxy接続

curl_setopt($ch, CURLOPT_PROXYPORT, 3128);//アクセスポート

curl_setopt($ch, CURLOPT_PROXY, "192.168.0.1");//IPアドレスかURL

POST送信


POST送信

<?php 

//postするデータの配列
$post_data = array('id' => "id" ,'password'=> "pass" ,"mode"=>"login");

curl_setopt($ch,CURLOPT_POST, true);

//データの配列を設定する
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));


Cookieを扱う


Cookieを扱う

<?php

// Cookie情報を保存する一時ファイルディレクトリにファイルを作成します
$tmp_path = tempnam(sys_get_temp_dir(), "CKI");

//postするデータの配列
$account_data = array('id' => "id" ,'password'=> "pass" ,"mode"=>"login");

$url = "http://www.pixiv.net/login.php";

$ch = curl_init(); // はじめ

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//POST送信
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($account_data));

//Cookie受信
//cookieオプション
curl_setopt($ch,CURLOPT_COOKIEFILE,$tmp_path);
curl_setopt($ch, CURLOPT_COOKIEJAR, $tmp_path);
curl_exec($ch);//実行
curl_close($ch); //終了

$url = "http://www.pixiv.net/mypage.php";
$ch = curl_init(); // はじめ

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//Cookie送信
//cookieオプション
curl_setopt($ch,CURLOPT_COOKIEFILE,$tmp_path);
curl_setopt($ch, CURLOPT_COOKIEJAR, $tmp_path);

$html = curl_exec($ch);//実行
curl_close($ch);

var_dump($html);

//一時ファイル削除
unlink($tmp_path);


リクエストヘッダーを付加する


リクエストヘッダーを付加

<?php

$headers = array(
"HTTP/1.0",
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding:gzip ,deflate",
"Accept-Language:ja,en-us;q=0.7,en;q=0.3",
"Connection:keep-alive",
"User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0"
);

$url = "http://www.ugtop.com/spill.shtml";
$ch = curl_init(); // はじめ
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//ヘッダー追加オプション
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$html = curl_exec($ch);
$html = mb_convert_encoding($html,"UTF-8","EUC-JP");
var_dump($html);
curl_close($ch); //終了


とりあえず、基本的な部分はまとめられたかと思います。

まだ様々なオプションがありますが、紹介しきれないのでいかに参考になりそうなURLを張っておきます。

公式マニュアル

http://php.net/manual/ja/book.curl.php

オプション一覧

http://jp2.php.net/curl_setopt

cURLのラッパークラスを作ってくださっている

http://qiita.com/mpyw/items/c65fb4ec4cef80909a47

CURLのセッションを引き継ぐ方法:PHPプロの記事

http://www.phppro.jp/phptips/archives/vol16/3