公開日:2012.12.26

cURL

テクログ

cURLは、さまざまなプラットフォームで使用可能ですが、私はPHP以外での使用経験が無いため、PHPでのcURL使用のみについて書いていきます。
使用方法としては別のシステムとのインターフェースに使ったり、
file_get_contentsが使用できない環境で代わりに使用したりなどといった形で使用してきました。
という事でそれに沿って説明していきます。

 

cURLは以下の4つのコマンドのみで実行できます。
・curl_init
・curl_setopt
・curl_exec
・curl_close
curl_initで初期化して
curl_setoptでオプションにより動作を設定し、
curl_execで実行して、
curl_closeで終了という流れです。

以下はfile_get_contents的に使用する場合の例になります。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://core-tech.jp/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$contents = curl_exec($ch);
curl_close($ch);

$contentsにhttps://core-tech.jp/のページソースが入ってきます。
レンタルサーバーなどfile_get_contentsが使用できない環境で代用できるかも。

さらにはログインが必要なページの取得も可能です。
もちろん、IDとパスワードがわかっているページが限定です。

Basic認証

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://core-tech.jp/target.html"); // 実際にはありません
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$id:$pass");
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
$contents= curl_exec($ch);
curl_close($ch);

 

cookie認証
これは少し面倒で2回呼ばないといけなくて、
最初にログインページからcookie情報をtmpというファイルに保存し、
次にcookie情報を引き継いで取得したいページから取ってくるといった感じになります。

$fp = fopen("tmp", "w");
$params = array("id" => "id", "pass" => "pass");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://core-tech.jp/login.html"); // 実際にはありません
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie");
curl_setopt($ch, CURLOPT_WRITEHEADER, $fp);
$output = curl_exec($ch);
curl_close($ch);
fclose($fp);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://core-tech.jp/target.html"); // 実際にはありません
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, "tmp");
$results[$pageid] = curl_exec($ch);
curl_close($ch);

 

インターフェースとして使用する場合
通信相手にもよりますが、POSTで値を渡して結果を得るという流れの例になります。
今回はpostでdata1とdata2を渡すと結果が得られるという仕様だとします。

$post = "data1=".urlencode("data1")."&data2=".urlencode("data2");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://core-tech.jp/target.html");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$contents= curl_exec($ch);
curl_close($ch);

 

オプションについては以下のサイトに資料があります
http://php.net/manual/ja/function.curl-setopt.php
ちなみに全ての例で使用しているCURLOPT_RETURNTRANSFERについては
「結果を文字列で返す」という設定になります。
それ以外のオプションも多数あるので使用するケースによって使い分けしてください。

 

複数のサイトに対して一括取得する場合は
curl_multi_initを使用します。

// 対象サイト
$url_list = array("https://core-tech.jp/", );
// マルチハンドルの用意
$mh = curl_multi_init();
// cURLハンドルの用意と、マルチハンドルへの登録
$ch_list = array();
foreach( $url_list as $url ) {
$ch_list[$url] = curl_init($url);
curl_setopt($ch_list[$url], CURLOPT_RETURNTRANSFER, TRUE);
curl_multi_add_handle($mh, $ch_list[$url]);
}
// 一括で通信実行、全て終わるのを待つ
$running = null;
do {
curl_multi_exec($mh, $running);
} while ( $running );
// 実行結果の取得
foreach( $url_list as $url ) {
// ステータスとコンテンツ内容の取得
$results[$url] = curl_getinfo($ch_list[$url]);
$results[$url]["content"] = curl_multi_getcontent($ch_list[$url]);
// Curlハンドルの後始末
curl_multi_remove_handle($mh, $ch_list[$url]);
curl_close($ch_list[$url]);
}
// マルチハンドルの後始末
curl_multi_close($mh);

これは取得するサイトの数が多すぎると取得自体ができなかったり、 動作が安定しませんでした。
やり方が悪かったのかな?

と、この辺りが私が知っているcURLの全てになります。

この記事を書いた人

core-corp

入社年2010年

出身地東京都

業務内容インフラ

特技または趣味ドライブ

core-corpの記事一覧へ

テクログに関する記事一覧