【PHP入門2021】ファイルを開く関数fopenの使い方 ~モード早見表付き

PHP

fopen関数の基本構文

ファイルやURLをオープンします。

fopen ( string $filename , string $mode , bool $use_include_path = false , resource $context = ? ) : resource

パラメータ

名前 初期値 説明
string $filename ファイルの名前やパス。https://などのスキームから始まるURLも入力できる。
string $mode ファイルのアクセス権限。後述の別表参照
bool $use_include_path false 指定されたファイルの検索にphpの設定の中のinclude_pathに設定されているディレクトリを参照するかどうか。
resource $context これを基にしてストリームを再設定する

モードについて

モードによりファイルのアクセス権限を指定します。

モードの種類には次の表に示したものがあります。
(現実的には「r, r+」 「w, w+」 「a, a+」だけ覚えておけばよいでしょう)

mode 読み/書き/追記 ファイルポインタ ファイル内容の消去 ファイル新規作成 備考
r 読み込み専用 先頭 × ×
r+ 読み込み/書き込み可能 先頭 × × ファイルの先頭に上書き
w 書き込み専用 先頭
w+ 読み込み/書き込み可能 先頭
a 追記専用 末尾 ×
a+ 読み込み/追記用 末尾 ×
x 書き込み専用 先頭 × ファイルがあれば E_WARNING
x+ 読み込み/書き込み用 先頭 × ファイルがあれば E_WARNING
c 書き込み専用 先頭 ×
c+ 読み込み/書き込み用 先頭 ×

フラグについて

フラグは改行の扱いを指定するものです。モードの末尾に付与させて使います。
何も指定しないとbが使われます。tは推奨されないので基本指定なしでよいでしょう。

b デフォルト。バイナリモード。
t Windows用。OSの改行をLF→CR+LFに自動変換する

返り値(戻り値)

説明
resource 成功時はファイルポインタを管理するリソース型のオブジェクト(ファイルハンドラやファイルストリームと同意)。失敗時はfalse

失敗するとE_WARNINGを発生させます

fopen関数の使い方

ファイルを1行ずつ読み込んで表示するサンプルソースコード

//=======================================================
// ファイルから1行ずつ読み込んで表示するサンプル
//=======================================================

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

// ファイルのオープン
$fp_r = fopen($read_file, "rb"); //読み込みファイルオープン

// 読み込みファイルを1行ずつ読み込みループする
while (($buffer = fgets($fp_r)) != false) {

	echo $buffer; //表示
}

fclose($fp_r); //読み込みファイルクローズ

ファイルを1行ずつ読み込んで表示するサンプルソースコード【ロック&エラー処理あり完全バージョン】

//=======================================================
// ファイルから1行ずつ読み込んで表示するサンプル(ロック&エラー対応版)
//=======================================================

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

try{

	echo "処理開始" . PHP_EOL;

	//---------------------------------------
	// 読み込みファイルのオープン&ロック処理
	//---------------------------------------
	$fp_r = fopen($read_file, "rb");
	if(is_resource($fp_r) === true){
		echo "読み込みファイルオープン成功 {$read_file}" . PHP_EOL;
		if (flock($fp_r, LOCK_SH) === true) { // ファイルをロックする(共有ロック)
			echo "読み込みファイルのロック成功 {$read_file}" . PHP_EOL;
		}else{
			throw new Exception("読み込みファイルのロック失敗 {$read_file}");
		}
	}else{
		throw new Exception("読み込みファイルオープン失敗 {$read_file}");
	}

	//---------------------------------------
	// 読み込みファイルを1行ずつ読み込みループする
	//---------------------------------------
	$line_num = 0;
	while (($buffer = fgets($fp_r)) != false) {
		++$line_num;
		echo $buffer;
	}

	//---------------------------------------
	//終了後のチェック
	//---------------------------------------
	if (feof($fp_r) === false) {
		throw new Exception("読み込みファイルが最後まで処理されていません {$read_file}");
	}

	echo "正常終了" . PHP_EOL;

}catch(Exception $ex) {

	//---------------------------------------
	// エラー処理
	//---------------------------------------
	echo "エラーメッセージ: " . $ex->getMessage() . PHP_EOL;

} finally { //finallyはPHP5.5より

	//---------------------------------------
	// 後処理。正常終了・エラー終了のいずれにしても実行
	//---------------------------------------
	if (is_resource($fp_r) === true) {
		echo "読み込みファイルロック解除 {$read_file}" . PHP_EOL;
		flock($fp_r, LOCK_UN); //ロック解除
		echo "読み込みファイルクローズ {$read_file}" . PHP_EOL;
		fclose($fp_r);
	}


}

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

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

関数 利用シーン 機能 処理単位 ハンドル
の管理
ロック 速度 メモリ節約 安全性 エラー時
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をコピーしました