

PHPでHTMLを取得する方法を調べたところ、  
file_get_contents、curl_exec、HttpRequestなどの手段があるそうなのですが、  
これら３つにどういう違いがあるのでしょうか？


CC BY-SA 3.0
2016-05-26T06:45:35.777
25190
2016-05-27T07:11:00.143
7918
question
php html
file_get_contentsとcurlとHttpRequestの違いについて


`file_get_contents`は内部向けで対象のファイルの内容を文字列として読み込みます。  
外に出れなくもないですが、ちょっと遅いです。

* * *

`cURL`は、`libcurl`から呼び出されるデータ転送用のライブラリですね。  
元々コマンドラインから`cURL`は使うのですが、  
PHPからでも転送時のオプションを設定することで色々なプロトコルで接続できます。  
ただしPHPをコンパイル時にcURLをサポートさせる必要があります。

* * *

`HTTP_Request`はPearモジュールでサーバに最初から入っていることは無いですね。  
モジュールのインストールに制約があるようなサーバなら使わないですね……便利ですけど  
`cURL`をラップして作られているので出来ることは`cURL`とほとんど変わりませんが、  
PHP5以上では並列で接続できるというメリットがあります。  
※`curl_multi`があるので`cURL`が並列処理できないわけではないです。  
ただ`curl_multi`はCPU食いつぶして重かったような記憶があります。


CC BY-SA 3.0
2016-05-26T07:16:31.997
25192
2016-05-26T07:16:31.997
25190
answer


こだわりがなければ`file_get_contents`が簡単で十分です。特に問題はありません。

一方で、WebAPIのようにHTTPヘッダにアクセストークンを付けてリクエストする必要がある場合など、複雑な場合はちょっとめんどくさい指定をする必要があるので注意してください。また、Composerでライブラリを導入できるなら[Guzzle,
an extensible PHP HTTP
client](https://github.com/guzzle/guzzle)を利用するのも良い選択肢です。

性能に大差はないので、自分の用途に合って、めんどくさくない/コードが読みやすい方法を利用すれば良いです。参考までに、各方法のサンプルコードを掲げます。

### file_get_contentsの場合

[code]

    <?php
    $query = [
        'fizz' => 'buzz',
        'ほげ' => 'ふが',
    ];
    $get_url = 'http://httpbin.org/get?' . http_build_query($query);
    $headers = [
        'User-Agent: PHP/' . PHP_VERSION,
    ];
    $opts = [
        'http' => [
            'header' => implode("\r\n", $headers) . "\r\n",
            'content' => $body,
        ]
    ];
    $json = file_get_contents($get_url, false, stream_context_create($opts));
    var_dump(json_decode($json, true));
    
[/code]

### curlを利用する場合

[code]

    <?php
    
    $query = [
        'fizz' => 'buzz',
        'ほげ' => 'ふが',
    ];
    $headers = [
        'User-Agent: PHP/' . PHP_VERSION,
    ];
    
    $curl = curl_init('http://httpbin.org/get?' . http_build_query($query));
    curl_setopt_array($curl, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => $headers
    ]);
    
    $json = curl_exec($curl);
    var_dump(json_decode($json, true));
    curl_close($curl);
    
[/code]

### Guzzle6の場合

[code]

    <?php
    
    include_once __DIR__ . '/vendor/autoload.php';
    
    $client = new \GuzzleHttp\Client;
    $query = [
        'fizz' => 'buzz',
        'ほげ' => 'ふが',
    ];
    $res = $client->get('http://httpbin.org/get', [
        'query' => $query,
        'headers' => [
            'User-Agent' => 'PHP/' . PHP_VERSION,
        ]
    ]);
    
    var_dump(json_decode($res->getBody(), true));
    
[/code]

これらのコードは <http://gihyo.jp/magazine/wdpress/archive/2016/vol92/support>
に書いたPHP記事のサンプルコードを抜萃したものです。(無料でダウンロードいただけます)

Vol.92の本誌ではこれらの手法の比較についてちょっと詳しく解説したので、興味があればお読みください ヾ(〃＞＜)ﾉﾞ☆

ちなみに、PECL
HTTPの`http\Client`は過去にPHPの公式マニュアルにも掲載されてたこともあるのですが、今年の初旬に削除されましたので推奨しません。また、PEARのライブラリは昨今ではあまり利用されません。


CC BY-SA 3.0
2016-05-26T11:57:11.660
25197
2016-05-27T07:11:00.143
2016-05-27T07:11:00.143
938
938
25190
answer


HTTP_Requestは使ったことがないので、curlとfile_get_contentsだけ回答します。

単純にURLにアクセスして情報を取得するだけであれば、file_get_contentsの方がシンプルに書けて便利です。

外部のAPIを使うためヘッダに認証キーを乗せたり、POSTで送信したりする場合は、curlの方がオプションの指定などを自然な感じで書けます。

指定できるオプションは下記にありますが、例えばプロキシを設定したり、HTTPS通信の際に証明書チェックを省略したり、という指定は、curlの方が探しやすいです。（file_get_contentsも、できなくはないと思いますが）

<http://php.net/manual/ja/function.curl-setopt.php>


CC BY-SA 3.0
2016-05-26T11:57:45.717
25198
2016-05-26T11:57:45.717
8278
25190
answer