だいぶ前の記事の続き。
今度はcURLでアクセスにチャレンジ。
単にCurlと言うとFlashの超すごい版みたいなWeb用言語のことですが、
http://ja.wikipedia.org/wiki/Curl_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)
PHPで言うところのcURLはlibcurlです。
元はCでしたが、PHPをはじめ多くの言語に移植されています。
httpをはじめftp、telnetといった有名な通信プロトコルに対応しており、認証や暗号化、ファイルアップロード等多くの機能を備えているという通信ライブラリです。
とりあえずcURLでfile_get_contents相当相当のことを行ってみます。
curl_file_get_contents.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//cURL
$ch = curl_init();
//cURLオプション
curl_setopt($ch, CURLOPT_URL, "http://example.com/index.php");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
//URL取得
$a=curl_exec($ch);
curl_close($ch);
print("<pre>");var_dump($a);die();
|
まあ、これだけならcURLを使う意味がありません。
cURLの特徴は多様なオプション設定が可能なところです。
ただ、PHPではあらゆるオプションをcurl_setoptに押し込むという荒技で処理しているため、素のままだと少々扱いづらいです。
http://jp2.php.net/manual/ja/function.curl-setopt.php
特にデフォルトだと問答無用でブラウザに出力してしまったりするのでどうにかします。
例によってクラス化してみましょう。
curl.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
class curlModel {
//メンバ変数
private $curl = array();
private $url = '';
//コンストラクタ
public function __construct($url,$port=null){
if(!$url){return false;}
$this->url=$url;
//Curlオブジェクトを用意
$this->curl=curl_init($url);
//Locationが指定されていればその先を呼び出す
curl_setopt($this->curl,CURLOPT_FOLLOWLOCATION,true);
//Locationを辿る最大回数
curl_setopt($this->curl,CURLOPT_MAXREDIRS,3);
//ヘッダを画面出力しない
curl_setopt($this->curl,CURLOPT_HEADER, false);
//返り値を画面出力しない
curl_setopt($this->curl,CURLOPT_RETURNTRANSFER,true);
//400以上のステータスコードが返ってきた場合取得しない
curl_setopt($this->curl,CURLOPT_FAILONERROR,true);
//更新日時を取得する
curl_setopt($this->curl,CURLOPT_FILETIME,true);
//接続先ポート
if($port){
curl_setopt($this->curl,CURLOPT_PORT,$port);
}
return true;
}
//あればBasic認証
public function setBasicAuth($user,$pass){
$basic=$user.':'.$pass;
curl_setopt($this->curl,CURLOPT_HTTPAUTH,CURLAUTH_ANY);
curl_setopt($this->curl,CURLOPT_USERPWD,$basic);
return true;
}
//GETパラメータをセット
public function setGetParam($get_array){
if(strpos($this->url,'?')===false){
$this->url.='?';
}
foreach($get_array as $key=>$val){
$this->url.=urlencode($key).'='.urlencode($val).'&';
}
curl_setopt($this->curl,CURLOPT_HTTPGET,true);
curl_setopt($this->curl,CURLOPT_URL,$this->url);
return true;
}
//POSTパラメータをセット
public function setPostParam($post_array){
curl_setopt($this->curl,CURLOPT_POST,true);
curl_setopt($this->curl,CURLOPT_POSTFIELDS,$post_array);
return true;
}
//実行
public function exec(){
return curl_exec($this->curl);
}
#↓クラスのおわり
}
|
まあ面倒なcurl_setoptをクラスに纏めただけです。
コンストラクタにURLと必要ならばポートを渡します。
setBasicAuthでベーシック認証、setGetParamでGETパラメータ、setPostParamでPOSTパラメータを与えてexecで実行します。
curl.php
1
2
3
4
5
6
7
8
9
10
11
|
require_once('./curl.class.php');
$url='http://yuubiseiharukana.blog.shinobi.jp/';
$get['a']='aa';
$get['b']='bb';
$curl=new curlModel($url);
$curl->setGetParam($get);
$ret=$curl->exec();
|
簡単に取得できました。
上の例ではこのブログに引数渡してますが、実際は引数とか見てないので全く意味ないですが。
あと実装が適当なので引数チェックしていないとか、setPostParamの後にsetGetParamしたら不穏な動きをしそうだとか、curl_setopt_arrayの存在に今気付いたとか色々あるけど気にしない。
PR
トラックバック
トラックバックURL: