PHPのfile_get_contentsでエラーハンドリングする
PHPのfile_get_contents関数で、サーバ上のファイルを読み込むことができますが、HTTP(or HTTPS)で参照できるコンテンツも取得することができます。
本当は、curlで書いたほうがいいですけどね。
本当は、curlで書いたほうがいいですけどね。
$ret = file_get_contents($url); if (!$ret) { throw new Exception("error"); }
さて、上記のコードとした場合、接続先から200以外のステータスコードが返ってきた場合やタイムアウト接続できなかった場合でも、warningエラーを出力して、後続の処理が継続されてしまいます。
単純な制御の場合は、この実装でよいのですが、エラー時のリトライや細かいエラーハンドリング、ステータスコードで処理をわけたい場合などは、以下のように処理を実装する必要があります。
$contextOptions = array( 'http' => array( "ignore_errors" => true, ) ); $context = stream_context_create($contextOptions); $http_response_header = array(); $ret = file_get_contents($url, false, $context); if(empty(http_response_header)){ throw new Exception("error. response header is empty"); } preg_match('/HTTP\/1\.[0|1|x] ([0-9]{3})/', $http_response_header[0], $matches); $statusCode = $matches[1]; if ($statusCode !== "200") { throw new Exception("error. status code:" . statusCode); } if (!$ret) { throw new Exception("error. response is empty"); } // process
これで、200以外の戻り値の場合、例外として処理できるようになりました。
contextを作成する際に、ignore_errorsパラメータを指定することで、内部ではエラーを無視して、http_response_headerという名前の変数に、ヘッダー情報を設定する動作となります。
$http_response_headerは使いまわされる(ループ処理する場合などに、前の結果が残ってしまう)ため、file_get_contentsを実行する前に初期化しておいたほうが安全です。
変数にセットされるエラー内容はこんな感じです。
contextを作成する際に、ignore_errorsパラメータを指定することで、内部ではエラーを無視して、http_response_headerという名前の変数に、ヘッダー情報を設定する動作となります。
$http_response_headerは使いまわされる(ループ処理する場合などに、前の結果が残ってしまう)ため、file_get_contentsを実行する前に初期化しておいたほうが安全です。
変数にセットされるエラー内容はこんな感じです。
( [0] => HTTP/1.1 403 Forbidden [1] => Content-Type: text/html; charset=iso-8859-1 [2] => Date: Sat, 13 May 2017 12:59:58 GMT [3] => Server: Apache [4] => Vary: Accept-Encoding [5] => Content-Length: 293 [6] => Connection: Close )
以上