忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/03/27 19:47 |
PHP1-49:PHPでcURL

だいぶ前の記事の続き。

今度は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
<?php
    //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
<?php
    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
<?php
    
    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


2009/01/30 17:49 | Comments(0) | TrackBack(1) | PHP

トラックバック

トラックバックURL:
HTTPリクエストを送受信するクラスです。 送受信ならfile_get_contents()やcurl_exec()で十分だろ、と思いきやこいつらには重大な問題があります。 何処かにPOST送信を行った際、ステータスコード302が返ってくるとそっちにGETで送り直しちゃうんだよね。 http://www.studyinghttp.net/status_code#Code302 本来POSTで302が返ってきたらユーザに一旦確認したうえで移動先にPOST送信する、というのが本来の動きな...
弱小PHPerの憂鬱 | 2010/10/05 22:07

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<JavaScript2-7:jQueryで画像アップロードプレビュー | HOME | PHP1-48:PHPで簡単ブログ>>
忍者ブログ[PR]