初心者向けにPHP でファイルを開く・読み込む・書き込む方法(fopen, fwrite, fread)を解説する記事
新人
「PHPでファイルを操作するには、どうすればいいんですか?」
先輩
「PHPでは、fopenやfread、fwriteを使ってファイルを開いたり、読み込んだり、書き込んだりできます。まず、ファイルを開く方法から説明しますね。」
新人
「それでは、ファイルを開く方法を教えてください!」
先輩
「まずは、fopen関数を使ってファイルを開く方法を見てみましょう。」
1. PHPでファイル操作をする理由(基本的な説明)
PHPでは、ファイルを開いてその中身を読み取ったり、内容を書き換えたりすることがよくあります。例えば、ユーザーの情報を保存したり、ログを記録したりする場合に必要です。PHPでは、ファイル操作を簡単に行うことができ、これから紹介する関数を使うことで、簡単にファイルを操作できます。
2. PHPのfopen関数の使い方(ファイルを開く)
fopen関数を使うと、指定したファイルを開くことができます。ファイルを開く際には、ファイルが存在しているか、書き込み・読み込みができる状態かを指定する必要があります。
例えば、ファイルを読み込み専用で開く場合、次のように記述します。
<?php
$file = fopen("sample.txt", "r"); // "sample.txt"を読み込み専用で開く
if ($file) {
echo "ファイルが正常に開かれました。";
fclose($file); // ファイルを閉じる
} else {
echo "ファイルを開けませんでした。";
}
?>
このコードでは、fopenを使って「sample.txt」ファイルを開き、成功した場合はメッセージを表示し、最後にファイルを閉じています。ファイルが開けない場合はエラーメッセージを表示します。
3. PHPのfread関数でファイルを読み込む方法
fread関数は、開いたファイルからデータを読み込むために使用します。この関数は、ファイルの内容を一度に指定したバイト数だけ読み込むことができます。
例えば、ファイル「sample.txt」から内容を1行ずつ読み込み、表示する場合は以下のように記述します。
<?php
$file = fopen("sample.txt", "r"); // ファイルを読み込み専用で開く
if ($file) {
// ファイルの内容を1行ずつ読み込んで表示
while ($line = fread($file, 1024)) { // 1024バイトずつ読み込み
echo $line . "<br>";
}
fclose($file); // ファイルを閉じる
} else {
echo "ファイルを開けませんでした。";
}
?>
このコードでは、freadを使ってファイルから1回に1024バイトずつデータを読み込み、ファイルの内容を表示しています。ファイルを開けたら、ファイルの中身を読み込むことができます。
4. PHPのfwrite関数でファイルに書き込む方法
fwrite関数は、開いたファイルにデータを書き込むために使用します。ファイルが書き込み可能な状態で開かれている場合に利用できます。
例えば、「sample.txt」ファイルに新しい内容を追加する場合、以下のように記述します。
<?php
$file = fopen("sample.txt", "a"); // ファイルを追加モードで開く
if ($file) {
$text = "新しい行を追加しました。";
fwrite($file, $text); // ファイルにデータを書き込む
fclose($file); // ファイルを閉じる
echo "データが正常に書き込まれました。";
} else {
echo "ファイルを開けませんでした。";
}
?>
このコードでは、fwriteを使って「sample.txt」ファイルに新しいテキストを追加しています。ファイルを「a」モード(追加モード)で開くことで、既存の内容を保持したまま新しいデータを追加できます。
5. ファイルを閉じる方法(fclose関数)
fclose関数は、開いたファイルを閉じるために使用します。ファイルの操作が終わったら、必ずファイルを閉じることが重要です。ファイルを閉じることで、リソースが解放され、他のプログラムがそのファイルを使えるようになります。
例えば、ファイルを読み込み後に閉じる場合、次のように記述します。
<?php
$file = fopen("sample.txt", "r"); // ファイルを読み込み専用で開く
if ($file) {
while ($line = fgets($file)) { // 1行ずつ読み込み
echo $line . "<br>";
}
fclose($file); // ファイルを閉じる
echo "ファイルを正常に閉じました。";
} else {
echo "ファイルを開けませんでした。";
}
?>
このコードでは、ファイルを読み込んだ後、必ずfcloseでファイルを閉じています。ファイルを閉じることで、後続の処理がスムーズに行えるようになります。
6. PHPでエラーハンドリングをする方法(ファイルが開けない場合)
PHPでファイル操作を行う際に、ファイルが存在しない、読み込み・書き込みできないなどのエラーが発生することがあります。こういったエラーを適切に処理することが大切です。PHPでは、fopen関数やその他のファイル操作関数を使用する際に、エラーハンドリングを行うことができます。
例えば、ファイルが開けない場合にエラーメッセージを表示するコードは次のようになります。
<?php
$file = fopen("nonexistent.txt", "r"); // 存在しないファイルを開こうとする
if (!$file) {
echo "ファイルを開けませんでした。エラー: " . error_get_last()['message']; // エラーメッセージを表示
} else {
echo "ファイルが正常に開かれました。";
fclose($file); // ファイルを閉じる
}
?>
上記のコードでは、fopenが失敗した場合、error_get_last()関数を使ってエラーメッセージを表示しています。ファイル操作を行う際には、こうしたエラーハンドリングを行うことが重要です。
7. ファイル操作を安全に行うためのベストプラクティス
PHPでファイル操作を安全に行うためには、いくつかのベストプラクティスを守ることが重要です。これらのベストプラクティスを守ることで、予期しないエラーを防いだり、セキュリティリスクを減らしたりすることができます。
1. **ファイルの存在確認**: ファイルを操作する前に、そのファイルが存在するかどうかを確認することが推奨されます。file_exists()関数を使うと、ファイルが存在するかどうかを確認できます。
<?php
if (file_exists("sample.txt")) {
echo "ファイルは存在します。";
} else {
echo "ファイルは存在しません。";
}
?>
2. **適切なファイルモードの使用**: ファイルを開く際には、適切なモード(読み込み、書き込み、追加など)を指定することが重要です。誤ったモードで開くと、予期しない結果になることがあります。
3. **エラーハンドリング**: ファイル操作が失敗した場合に備えて、エラーハンドリングを行うことを忘れずに。fopenやfwriteの失敗に備え、エラーメッセージを表示するようにします。
4. **ファイルを操作後に必ず閉じる**: ファイルを開いた後は、必ずfcloseでファイルを閉じましょう。これを行わないと、リソースが無駄に消費され、他のプログラムがそのファイルを使えなくなってしまうことがあります。
8. 実際の開発で使えるファイル操作の例(ログファイルの書き込みなど)
ファイル操作は、実際の開発でも非常に役立ちます。例えば、ログファイルにエラーメッセージや情報を記録する場合、PHPで簡単にファイル操作を行うことができます。
以下は、エラーログを「error_log.txt」に書き込む例です。実際の開発では、エラーメッセージやユーザーのアクションログを保存するのに役立ちます。
<?php
// エラーメッセージをログファイルに書き込む
$file = fopen("error_log.txt", "a"); // 追加モードで開く
if ($file) {
$error_message = "エラーが発生しました: " . date("Y-m-d H:i:s") . " - サーバーの問題\n";
fwrite($file, $error_message); // ファイルにエラーメッセージを書き込む
fclose($file); // ファイルを閉じる
echo "エラーメッセージがログファイルに書き込まれました。";
} else {
echo "ログファイルを開けませんでした。";
}
?>
このコードでは、error_log.txtというファイルにエラーメッセージを追記しています。ログファイルは、システムのトラブルシューティングや、ユーザーの行動履歴を追跡するのに非常に役立ちます。
ファイル操作は非常に強力なツールですが、セキュリティやエラーハンドリングに注意して、安全に使うことが大切です。
まとめ
ここまでの内容をひとつの流れで振り返ると、PHPによるファイル操作は「開く(fopen)→処理する(fread / fwrite)→閉じる(fclose)」という基本の型を丁寧に守ることに尽きます。読み込みではファイルサイズや終端を意識しながら少しずつ扱い、表示前にはhtmlspecialcharsやnl2brで整形すると画面が安定します。書き込みでは、追記は"a"、上書きは"w"、必要に応じてflockでロックを挟み、最後は必ずfcloseで後片付けします。加えて、相対パスの基準、フォルダの有無、読み書き権限の確認はつまずきを減らす近道です。ログの記録や設定の保存、CSVの入出力など、日常でよくある処理はすべてこの型の延長で解けます。
実務で頼りになるのは、小さく確実に積み重ねる姿勢です。file_existsやis_readable、is_writableで事前チェックを入れる、書き込みは一時ファイルに出力してrenameで差し替える、ユーザー入力のファイル名はbasenameで無害化する——こうしたひと手間が、トラブルの芽を早い段階で摘んでくれます。もし失敗したらerror_get_lastで原因を添えて表示し、必要なら警告を例外化してtry/catchでまとめて扱うと、原因の切り分けが楽になります。最初はシンプルなログ追記から始め、だんだんとフォーマットやローテーション、CSVの検証などを足していけば、堅実で見通しのよいコードに育っていきます。
<?php
// 日毎にログを分けて肥大化を防止
$log = __DIR__ . "/logs/app_" . date("Ymd") . ".log";
// フォルダが無ければ作成
$dir = dirname($log);
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
// 追記モードで開く
$fp = fopen($log, "a");
if ($fp === false) {
$err = error_get_last();
echo "ログを開けませんでした: " . ($err["message"] ?? "原因不明");
return;
}
// ロックしてから1行だけ書く
if (flock($fp, LOCK_EX)) {
$msg = "ファイル操作の確認が完了しました。";
$line = sprintf("%s\tINFO\t%s%s",
date("Y-m-d H:i:s"),
str_replace(["\r", "\n"], " ", $msg),
PHP_EOL
);
fwrite($fp, $line);
flock($fp, LOCK_UN);
}
fclose($fp);
echo "ログに記録しました。";
?>
htmlspecialcharsで無害化、ファイル名はbasenameで安全に。
生徒「きょうの学びは、開く・処理する・閉じるの順番を体で覚えることでした。読み込みは少しずつ、表示前に整形、でしたよね。」
先生「その通り。書き込みはfwriteに加えてflockで衝突を防ぐ、最後は必ずfclose。小さく確実に、が合言葉だ。」
生徒「失敗したときはerror_get_lastで原因を添えると追跡が楽、というのも実感しました。ログは日付で分けると読みやすいですね。」
先生「うん。次は同じ型でCSVや設定ファイルも扱ってみよう。今日のコードをベースに、少しずつ拡張すれば大丈夫。」