【PHP入門2021】ファイルやURLの内容を全て読み込む関数file_get_contentsの使い方

PHP

file_get_contents関数の基本構文

ファイルやURLで指定した内容を全て変数に格納します。

一気にメモリ内に全行格納するため、行数が多い場合の処理は高速で時間はかからないですがメモリ消費が大きくなる可能性があります。

fopen/fcloseなどのファイル操作は不要で便利ですが、ファイルのロックはされないので注意してください。

複数人が任意のタイミングで同時に書き込むようなファイルの読み込み処理の場合は読み込み時に書かれてしまい、破損したファイルを読み込む可能性があるのでfile_get_contentsの使用は避けた方がよいでしょう。

読み込み中は書かせない等のロックをかける必要があるのでfreadを使って自分で開閉(fopen/fclose)とロック管理(flock)した方がよいです。

file_get_contents ( string $filename , bool $use_include_path = false , resource $context = ? , int $offset = 0 , int $length = ? ) : string|false

パラメータ

名前 初期値 説明
string $filename ファイルの名前やパス。https://などのスキームから始まるURLも入力できる。
bool $use_include_path false 指定されたファイルの検索にphpの設定の中のinclude_pathに設定されているディレクトリを参照するかどうか。
resource $context stream_context_create() で作成したコンテキストリソース。未使用の場合はnull
int $offset 0 読み込み開始オフセット位置。
int $length 読み込み最大バイト数

返り値(戻り値)

説明
string|false 読み込んだデータを返す。失敗時はfalse

失敗の内容によってはE_WARNINGが発生します。

file_get_contents関数の使い方

ファイルから中身のテキストを一気に読み込み変数に格納するサンプルソースコード

//=======================================================
// ファイルから中身のテキストを一気に読み込み変数に格納するサンプル
//=======================================================

$read_file = 'input/line-100.csv'; //読み込みファイル

$data = file_get_contents($read_file);

print_r($data);

exit;

ファイルのテキストを一気に読み込みその後行ごとに処理するサンプルソースコード

//=======================================================
// ファイルのテキストを一気に読み込みその後行ごとに処理するサンプル
//=======================================================

$read_file = 'input/line-100.csv'; //読み込みファイル

$data = file_get_contents($read_file);

$lines = preg_split("/\r*\n/", $data); //テキストを改行で分割

foreach($lines as $line){
	if(trim($line) == null){
		continue; //空行はスキップ
	}
	echo $line . PHP_EOL;
}

【応用】URL,ファイルどちらからでも読み込めてエラー処理もするサンプルソースコード

//=======================================================
// URL,ファイルどちらからでも読み込めてエラー処理もあるサンプル
//=======================================================

//コンテンツ取得先
$url_or_file = "https://trios.pro/test-page/"; //URLの場合
//$url_or_file = "https://trios.pro/notfound/"; //URLの場合(404エラー)
//$url_or_file = 'input/line-100.csv'; //ファイルの場合
//$url_or_file = 'notfound/line-100.csv'; //ファイルの場合(存在しないファイル)

$is_url = false; //読み込み元がURLかどうか
$context = null; //HTTP通信の場合のストリームのコンテキスト

try{

	//与えられたデータ読み込み元がURLかどうか
	if(preg_match("|^https?://|", $url_or_file) > 0){
		$is_url = true;
		//リクエストヘッダの内容を設定
		$opts = array(
			'https' => array(
				'method'=> "GET",
				'header'=> "Content-Type: text/html; charset=UTF-8\r\n"
					. "Accept-Encoding: gzip, deflate, br\r\n"
					. "Cookie: test_cookie1=abc; test_dookie2=def\r\n"
			)
		);
		$context = stream_context_create($opts); //ストリームのコンテキスト作成
	}

	//ファイルまたはURLのデータの内容取得
	echo "データ読み込み: {$url_or_file}" . PHP_EOL;
	$data = file_get_contents($url_or_file, false , $context);

	//正常にデータが取得できた
	if($data !== false){
		echo "読み込んだバイト数: " . strlen($data) . PHP_EOL;

		//$dataと使ってここに成功した時の処理をかく

	//異常終了
	}else{

		//URLから取得する場合
		if($is_url === true){

			//レスポンスがある場合
			if(isset($http_response_header[0])){
				//「$http_response_header[0]」にはステータスコードがセットされている
				$response = explode(' ', $http_response_header[0]);  //「$status_code[1]」にステータスコードの数字だけが入る
				$response_code = $response[1];
				//レスポンスコードが 1**, 2**, 3**なら成功とする
				if(preg_match("/^[123][0-9][0-9]$/", $response_code) > 0){
					echo "データを正常取得 レスポンスコード: {$response_code}" . PHP_EOL;
				}else{
					throw new Exception("HTTPエラーが発生しました。 レスポンスコード: {$response_code}");
				}
			//レスポンスがない場合は失敗
			}else{
				throw new Exception("URL: {$url_or_file}のデータを取得できませんでした(HTTP通信失敗)");
			}

		//ファイルから取得する場合
		}else{
			throw new Exception("ファイル: {$url_or_file}のデータを取得できませんでした");
		}

	}

	if(is_array($http_response_header)){
		print_r($http_response_header);
	}

	echo "正常終了" . PHP_EOL;

}catch(Exception $ex) {

	echo "エラー終了します。" . PHP_EOL . $ex->getMessage() . PHP_EOL;

}finally{

	//初期化
	if(is_array($http_response_header)){
		$http_response_header = null;
	}

}

関連するファイルシステム関数

ファイル入出力関数の特徴まとめ

関数 利用シーン 機能 処理単位 ハンドル
の管理
ロック 速度 メモリ節約 安全性 エラー時
fgetc 1文字ずつ処理する 読み 1文字ずつ 別途 別途 × △自前 終端でfalse
fgets 1行ずつ処理する 読み 1行ずつ 別途 別途 △自前 終端かエラー
でfalse
fread 固定バイトごとに
処理する
読み 指定バイト 別途 別途 ○一括
×分割
×一括
○分割
△自前 エラーでfalse
fgetcsv CSVファイルを
1行ずつ読み込む
読み 1行ずつ 別途 別途 × △自前 エラーで0かnull
file ロック不要のファイル
を行ごとに高速処理
&同時アクセスが少ない
読み データ全部 不要 ロックなし × × エラーでfalseや
E_WARNING
file_get_contents ロック不要のファイル
の文字列全体を高速取得
&同時アクセスが少ない
読み データ全部 不要 ロックなし × × エラーでfalseや
E_WARNING
fwrite
fputs
ハンドル利用時の
書込処理全般
書き 指定バイト 別途 別途 ○一括
×分割
×一括
○分割
△自前 エラーでfalse
fputcsv CSVを1行ずつ書込時 書き 1行ずつ 別途 別途 × △自前 エラーでfalse
file_put_contents 1~数回だけ書込する時。
繰り返しは非常に遅い。
書き データ全部 不要 ロック指定可能 ○一括
×分割
×一括
○分割
△フラグ指定 エラーでfalse

ファイルシステム関数一覧

fopen

fclose

flock

feof

fgetc

fgets

fread

fwrite/fputs

fgetcsv

fputcsv

file

file_get_contents

file_put_contents

コメント

タイトルとURLをコピーしました