PHP cURLの色々な使い方

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


```php:file_get_contents使い方
<?php
$url = "http://www.yahoo.co.jp/";
$html = file_get_contents($url);
var_dump($html);
```

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

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

```php:基本的な使い方
<?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取得情報を確認する

````php: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) ""
}

````


よく使うオプション

```php:基本オプション
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//変数に保存する
curl_setopt($ch, CURLOPT_HEADER, true); // ヘッダも出力したい場合
```


proxy接続を行う


```php:proxy接続
curl_setopt($ch, CURLOPT_PROXYPORT, 3128);//アクセスポート
curl_setopt($ch, CURLOPT_PROXY, "192.168.0.1");//IPアドレスかURL
```

POST送信

```php: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を扱う

```php: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:リクエストヘッダーを付加
<?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