スポンサードリンク

【PHP】file_get_contents関数を使うときのエラー処理の方法

公開日:
更新日:
カテゴリー: PHP

file_get_contents関数は手軽に外部にあるデータを取得できますが、外部の環境に依存するためエラー処理をしっかり記述しておく必要があります。

ここではfile_get_contents関数を使うときの詳細なエラー処理について説明しています。

スポンサードリンク

 file_get_contents関数と「$http_response_header」について

file_get_contents関数を使って次のようなプログラムを実行した場合、

<?php

//データの取得先
$url = "http://ysklog.net/life/2223.html";

//file_get_contents関数でデータを取得
$data = @file_get_contents($url);

//「$http_response_header」の参照
print_r($http_response_header);

?>

「$http_response_header」には次のようなレスポンスヘッダがセットされます。

【取得が成功した場合】
Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Date: Sat, 07 Feb 2015 00:27:40 GMT
    [2] => Server: Apache
    [3] => X-Pingback: http://ysklog.net/xmlrpc.php
    [4] => Link: ; rel=shortlink
    [5] => Connection: close
    [6] => Content-Type: text/html; charset=UTF-8
)

 

【存在しないページだった場合(404エラー)】
Array
(
    [0] => HTTP/1.1 404 Not Found
    [1] => Date: Sat, 07 Feb 2015 01:00:50 GMT
    [2] => Server: Apache
    [3] => X-Pingback: http://ysklog.net/xmlrpc.php
    [4] => Expires: Wed, 11 Jan 1984 05:00:00 GMT
    [5] => Cache-Control: no-cache, must-revalidate, max-age=0
    [6] => Pragma: no-cache
    [7] => Connection: close
    [8] => Content-Type: text/html; charset=UTF-8
)

 

【タイムアウトの場合 or 存在しないドメインのページだった場合】
null(レスポンスヘッダはセットされない)

 ※その他のエラー(4**エラーや5**エラー)の場合は省略

「$http_response_header」をもとにエラー処理を行う

file_get_contents関数を実行すれば「$http_response_header」にレスポンスヘッダがセットされるため、「$http_response_header」をもとにエラー処理を行えます。

具体的には、次のようにすれば良いと思います。

<?php

//データの取得先
$url = "http://ysklog.net/life/2223.html";

//file_get_contents関数でデータを取得
if($data = @file_get_contents($url)){
	//ここにデータ取得が成功した時の処理
}else{
	//エラー処理
	if(count($http_response_header) > 0){
		//「$http_response_header[0]」にはステータスコードがセットされているのでそれを取得
		$status_code = explode(' ', $http_response_header[0]);	//「$status_code[1]」にステータスコードの数字のみが入る

		//エラーの判別
		switch($status_code[1]){
			//404エラーの場合
			case 404:
				echo "指定したページが見つかりませんでした";
				break;

			//500エラーの場合
			case 500:
				echo "指定したページがあるサーバーにエラーがあります";
				break;

			//その他のエラーの場合
			default:
				echo "何らかのエラーによって指定したページのデータを取得できませんでした";
		}
	}else{
		//タイムアウトの場合 or 存在しないドメインだった場合
		echo "タイムエラー or URLが間違っています";
	}
}

?>

プログラムで複数のfile_get_contents関数を使うときの注意点

プログラムで複数のfile_get_contents関数を使う場合、あるときのfile_get_contents関数でデータ取得が成功した場合「$http_response_header」にはそのときのレスポンスヘッダがセットされます。

しかしその次のfile_get_contents関数でタイムエラーが生じた場合、「$http_response_header」にはnull値が上書きされず、前回のレスポンスヘッダがセットされたままとなります(つまりエラー処理の条件分岐が正しく動かない)。

//①データの取得が成功
file_get_contents($url);

//②タイムエラーが生じる
file_get_contents($url);

//②ではなく①のレスポンスヘッダがセットされている
print_r($http_response_header);

これを防ぐためには、以下のコードをfile_get_contents関数を使用する直前(上記(2つ上)のエラー処理プログラムコードであれば5行目)に挿入する必要があります。

//「$http_response_header」の初期化
$http_response_header = array();

コメント

まだコメントはありません。

コメントフォーム
お名前
コメント