[PR] あなたが Kindle で読みたいその本、Kindle に対応したら Twitter でお知らせします。

PHP の file_get_contents でステータスコードを取得する

Posted on

PHP の file_get_contents は外部リソースを手軽に扱えるので、Web サービスの API を使うときに便利です。

手軽に使える反面、例外処理をちゃんと考えておかないと 4xx や 5xx のステータスコードが返ってきたときに Warnning エラーが発生します。 file_get_contents でステータスコードを取得するにはひと手間かける必要があります。

$context = stream_context_create(array(
    'http' => array('ignore_errors' => true)
));
$response = file_get_contents('http://example.com/', false, $context);

$pos = strpos($http_response_header[0], '200');
if ($pos === false) {
    // 例外処理
}

ignore_errors コンテキストを true にすることで、ステータスコードが 4xx や 5xx でも Warnning エラーが発生せずレスポンスを受け取れるようになります。

file_get_contents で HTTP ラッパーを使うと $http_response_header にレスポンスヘッダが自動的にセットされます。ステータス行は必ず 1 行目なので $http_response_header[0] を確認すればステータスコードが分かります。

ステータスコードによって処理を振り分けるのであれば、正規表現でステータスコードを取り出します。

$context = stream_context_create(array(
    'http' => array('ignore_errors' => true)
));
$response = file_get_contents('http://example.com/', false, $context);

preg_match('/HTTP\/1\.[0|1|x] ([0-9]{3})/', $http_response_header[0], $matches);
$status_code = $matches[1];

switch ($status_code) {
    case '200':
        // 200の場合
        break;
    case '404':
        // 404の場合
        break;
    default:
        break;
}

simplexml_load_file のようにストリームコンテキストを拡張できない関数の場合は、いったん上記の方法で文字列として受け取り simplexml_load_string で処理すればよいでしょう。