PHPでAPI叩くなら、file_get_contentsでいいじゃない?


こんにちは。
開発チームのワイルド担当、まんだいです。

PHPのfile_get_contentsというメソッドをご存知でしょうか?
ファイルオープンの処理が簡潔に書けるため、重宝するメソッドかと思いますが、このメソッドにはファイル読み込み以外にも、簡単なウェブアクセスツールとしての使い方があります。
今日はこの辺りがどこまで使えるのか、限界を調査してみたいと思います。

 

file_get_contentsの基本

簡単なサンプルとして、弊社のトップページを取得するには、以下の様なソースになります。

<?php
$html = file_get_contents('https://beyondjapan.com');

 
これは問題ないと思います。
これがうまく動かない場合は、php.iniのallow_url_fopenの項目が以下のようになっているか確認してください。

allow_url_fopen = On

 

file_get_contentsの応用

file_get_contentsメソッドはHTMLをゲットする事しかできない訳ではありません。
次は、stream_context_createメソッドを使ってPOST送信をしてみます。

stream_context_createメソッドのマニュアルを見てみると、「ストリームコンテキストを作成する」とだけ記載されています。
このストリームコンテキストを操作する事で、POST送信できるようになります。

<?php
$data = [
    'title' => '送信テスト',
    'body' => 'テスト',
];

$opts = [
    'http' => [
        'method' => 'POST',
        'header' => implode("\r\n", [ 
            "User-Agent: hogehoge",
            "Accept-Language: ja",
            "Cookie: test=hoge",
        ]),
    ],
    'data' => http_build_query($data)
];

$ctx = stream_context_create($opts);

$response = file_get_contents('http://example.com/inquiry', false, $ctx);

 
POST送信したいデータはhttp_build_queryでURLエンコードとクエリ文字列変換を事前にしておきます。
JSONデータの場合は、json_encodeメソッドを通した後、urlencodeメソッドでURLエンコードする感じです。

 

file_get_contentsの真価

ストリームコンテキストでヘッダ情報を作れるので、先の例でも示しましたが、Cookieも思い通り!
Basic認証の突破や、セッションを使ったサイトの巡回などもできます。

また、Chatwork APIのようなヘッダ情報にAPI KEYを埋め込むタイプのAPIにも対応できます。

SSL通信を行いたい場合も特に考える必要はなく、プロトコルに 「https://」を指定するだけです。

また、これが言いたいがためにこのブログを書いた訳なのですが

file_get_contentsは、php-curlがインストールされていない環境でも動作するため、curlライブラリの代替処理としても使えます。
(もちろん、curlの方が高機能なのは言うまでもありません)

 
以上です。


この記事をかいた人

About the author