PHPでfile_get_contents使ったHTTP接続がエラーなのかタイムアウトなのかを判別する
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使えばいいじゃんという声が聞こえたような気がしなくもないですが、気のせいですねきっと。