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 |
コメント