PHPでは、テキストファイルやログファイルなどの読み書き操作を簡単に行うことができます。
この記事では、ファイルの「読み込み」「書き込み」「追記」「存在確認」など、実践的なコード例を交えて解説します。
PHPでファイルの読み書きを実装したい方は、ぜひ参考にしてください。
目次
ファイル操作で使う主な関数
PHPでよく使うファイル操作関数は以下のとおりです。
関数 | 説明 |
---|---|
fopen() | ファイルを開く(モード指定あり) |
fread() | ファイルを読み込む |
fwrite() | ファイルに書き込む |
fclose() | ファイルを閉じる |
file_get_contents() | ファイル全体を読み込む(簡易版) |
file_put_contents() | ファイルに書き込む(簡易版) |
ファイルを読み込む方法
方法①:file_get_contents(もっとも簡単)
$contents = file_get_contents('sample.txt');
echo $contents;
file_get_contents()
は、ファイルの中身をまるごと文字列として読み込むシンプルで便利な関数です。
HTMLテンプレートやJSONファイル、テキストログの読み取りなどによく使われます。
このコードでは、sample.txt
の中身をすべて読み込んで変数 $content
に格納し、それを echo
で出力しています。
file_get_contentsの特徴と利点
- 非常にシンプルで読みやすい。
- 小〜中規模ファイルの読み込みに最適。
- HTTP/HTTPS の URL にも対応しており、外部ファイルを取得することも可能です。
外部URLの読み込み(allow_url_fopen が有効な場合)
$html = file_get_contents('https://example.com');
※ セキュリティの観点から、本番環境では外部URLの使用には注意が必要です。
ファイルが存在しない場合の対処
ファイルが存在しない、またはアクセス権限がない場合、false
が返されます。エラー処理を加えることで安全に使えます。
$file = 'sample.txt';
$content = @file_get_contents($file);
if ($content === false) {
echo "ファイルを読み込めませんでした。";
} else {
echo $content;
}
@
を使うと警告を非表示にできますが、開発中は表示させておく方が安全です。
方法②:fopen+freadを使う
$handle = fopen('sample.txt', 'r');
$contents = fread($handle, filesize('sample.txt'));
fclose($handle);
echo $contents;
fopen()
と fread()
を組み合わせることで、より柔軟にファイルを読み込むことができます。
ファイルサイズの大きいデータや、読み込みの進捗を管理したい場合などにも適しています。
説明
fopen()
:ファイルを指定したモードで開き、ファイルハンドルを返します。fread()
:第2引数で指定したバイト数だけファイルから読み込みます。filesize()
:ファイルサイズを取得し、ちょうどその分だけ読み込む。fclose()
:使用後は必ずファイルを閉じてリソースを開放します。
読み込みモード一覧(抜粋)
モード | 説明 |
---|---|
'r' | 読み込み専用。ファイルが存在しないと失敗する |
'rb' | 読み込み専用(バイナリモード) |
fread のメリット
- 一部だけを読み込む(バイト数指定)ことができる
- 大きなファイルに対して段階的な読み込みができる
- ファイルストリームとして扱うので、より柔軟な処理が可能
注意点
filesize()
はファイルサイズが取得できない場合(URLなど)にfalse
を返すことがあります。- バイナリファイル(画像、PDFなど)を扱うときは
'rb'
モードで開くのが推奨されます。
このように fopen()
+ fread()
を使うことで、読み込み処理に細かい制御を加えることができます。より高度なファイル処理が求められる場面では積極的に活用してみましょう。
ファイルに書き込む方法
方法①:file_put_contents(上書き)
$text = "こんにちは、PHP!\n";
file_put_contents('sample.txt', $text);
既存のファイルがある場合、上書きされます。
file_put_contents()
は、文字列をファイルに書き込むための簡易関数です。fopen()
・fwrite()
・fclose()
をまとめて1行で実現できるため、手軽に使いたい場合に適しています。
このコードは、sample.txt
に $text
の内容を書き込みます。ファイルがすでに存在する場合は上書きされます。
内容を追加したい場合
ファイルに追記したいときは、第3引数に FILE_APPEND
フラグを渡します。
file_put_contents('sample.txt', "追加の行\n", FILE_APPEND);
これにより、ファイルの末尾に内容が追加されます。ログファイルの記録などに便利です。
ファイルロックをかけたいとき(排他制御)
複数プロセスで同時に書き込むような場面では、排他ロックを使うと安全です。
file_put_contents('sample.txt', "安全に書き込む\n", FILE_APPEND | LOCK_EX);
FILE_APPEND
:追記モードLOCK_EX
:書き込み時に排他ロックをかける
書き込みに失敗した場合
何らかの理由で書き込みに失敗した場合、false
が返されます。
$result = file_put_contents('sample.txt', $text);
if ($result === false) {
echo "ファイルの書き込みに失敗しました。";
}
特徴と用途
- 簡潔にファイル出力を行いたいときに便利
- ログファイルやキャッシュファイルの保存に最適
- 一時的な保存や設定ファイルの上書きにも利用される
このように file_put_contents()
は、少ないコードで効率よくファイル操作が行える便利な関数です。処理を簡潔にしたい場合には、まずこの関数の利用を検討するとよいでしょう。
方法②:fopen+fwriteを使う
$handle = fopen('sample.txt', 'w');
fwrite($handle, "これは新しい内容です。\n");
fclose($handle);
'w'
モードはファイルを新規作成または上書きします。
fopen()
と fwrite()
を組み合わせることで、ファイルへの書き込みを柔軟に制御できます。たとえば、追記、バイナリファイルの扱い、部分的な書き込みなどが可能です。
このコードは、sample.txt
を開いて内容を上書きし、”これは新しい内容です。” というテキストを保存します。
使用例:追記モードで書き込み
$handle = fopen('sample.txt', 'a'); // 'a' モードで開く(追記)
fwrite($handle, "追記された内容です。\n");
fclose($handle);
'a'
モードは、ファイル末尾に内容を追加するためのモードです。
書き込みモード一覧(抜粋)
モード | 説明 |
---|---|
'w' | 書き込み専用。既存ファイルを上書き |
'a' | 書き込み専用。ファイルがあれば末尾に追記 |
'x' | 書き込み専用。ファイルが存在する場合は失敗 |
'b' | バイナリモード(他のモードと併用) |
注意点
fopen()
に失敗するとfalse
が返るため、エラーチェックが重要です。- 書き込み後は
fclose()
で必ずファイルを閉じましょう。 - 複数プロセスから書き込む可能性がある場合は、
flock()
による排他ロックも検討しましょう。
$handle = fopen('sample.txt', 'a');
if (flock($handle, LOCK_EX)) {
fwrite($handle, "ロック付きで追記します。\n");
flock($handle, LOCK_UN);
}
fclose($handle);
このように fopen()
+ fwrite()
を使えば、より細かい書き込み制御が可能です。ログの逐次記録、バイナリデータの保存、部分書き込みなど、応用範囲は広いです。
ファイルに追記するには?
追記(append)には 'a'
モードを使います。
$handle = fopen('sample.txt', 'a');
fwrite($handle, "これは追記された内容です。\n");
fclose($handle);
これで既存の内容は残したまま、新しいテキストが末尾に追加されます。
ファイルの存在を確認する
if (file_exists('sample.txt')) {
echo "ファイルが存在します。";
} else {
echo "ファイルが見つかりません。";
}
ファイル操作の注意点
- 書き込み処理を行う前にはバックアップを取るのが安心です。
- ファイルの書き込みにはサーバーの**パーミッション(権限)**が必要な場合があります。
- 複数のユーザーが同時にアクセスする場合は、
flock()
を使った排他ロックを検討しましょう。
まとめ
PHPでファイルを扱うには、簡易的な関数(file_get_contents
, file_put_contents
)と、より詳細な制御ができる関数(fopen
, fwrite
, fread
)を用途によって使い分けるのがコツです。
ログ保存や一時的なデータ処理など、日常的なWebアプリ開発で非常に役立つので、ぜひ実際に手を動かして試してみましょう!