読者です 読者をやめる 読者になる 読者になる

PHPでfile_get_contents使ったHTTP接続がエラーなのかタイムアウトなのかを判別する

PHP

PHPでサーバ-サーバ間でREST-APIを使うとき、file_get_contentsを使うのが簡単なんですが、エラーレスポンスの場合、その状況をどう解釈したらいいのかという説明がどうもあいまいな気がしたので、ちょっと調べてみました。

レスポンスコード200とエラー、それと、タイムアウトを判別する方法は、どうやらこんな感じみたいです。

<?php
    $data = @file_get_contents('http://hostname/resouce', false,
        stream_context_create(array(
            'http' => array(
                'timeout'=>10 // 早めにタイムアウト
            )
        ))
    );
    if($data === FALSE)
    {
        if(count($http_response_header) > 0)
        {
            $stat_tokens = explode(' ', $http_response_header[0]);
            switch($stat_tokens[1])
            {
            case 404:
                // 404 Not found の場合
                break;
            case 500:
                // 500 Internal Server Error の場合
                break;
            default:
                // その他
                break;
            }
        }
        else
        {
            // タイムアウトの場合
        }
    }
    else
    {
        // 成功
    }
?>

file_get_contentsがHTTPリクエストだった場合、$http_response_header という配列に、その結果のレスポンスヘッダが入っているのだとか。HTTPレスポンスヘッダの先頭行はステータスなので、そこからエラーコードが取れました。

タイムアウトした場合はその配列が空になっていました。なので、長さゼロで分岐しています。

とりあえずこんな感じ、なのかな。

PEAR::HTTP_Request使えばいいじゃんという声が聞こえたような気がしなくもないですが、気のせいですねきっと。