1. 本記事のポイント
- PHPでファイルの存在を安全に確認する方法を解説
- 実務で使われるファイル削除処理とその注意点を紹介
- 削除処理におけるエラーハンドリングやパーミッション問題にも触れる
2. PHPにおけるファイルの存在チェックと削除処理とは?
PHPでは、ローカルファイルの存在確認や削除といった基本的なファイル操作を標準関数で行えます。
file_exists()
は指定されたパスにファイルまたはディレクトリが存在するかを確認でき、unlink()
はファイルを削除する関数です。これらはファイルアップロード後の一時ファイル処理、キャッシュファイルのクリア、不要ログの削除など、日常的なバックエンド開発で多用されます。
特にWebアプリでは、ユーザー操作や自動スクリプトによってファイルの存在が不確定な場合も多く、安全な存在チェックと例外への対処が求められます。
また、これらの関数はパーミッションやファイルロック状態に依存するため、設計時には事前条件や例外発生時のロールバックなども考慮する必要があります。
3. 詳細解説
ファイルの存在を確認する: file_exists()
まず、指定したファイルが存在するかを確認する基本的な処理です。
$file = 'data/sample.txt';
// ファイルの存在を確認
if (file_exists($file)) {
echo "ファイルは存在します\n";
} else {
echo "ファイルが存在しません\n";
}
この関数はファイルだけでなくディレクトリの存在も確認可能です。ただし、シンボリックリンク先が切れている場合でも true
を返す点に注意が必要です。
ファイルを削除する: unlink()
ファイルの存在を確認した上で削除する安全な方法です。
$file = 'data/sample.txt';
if (file_exists($file)) {
if (unlink($file)) {
echo "ファイルを削除しました\n";
} else {
echo "ファイルの削除に失敗しました\n";
}
} else {
echo "削除対象のファイルが存在しません\n";
}
unlink()
は削除に失敗すると false
を返すため、明示的なエラーハンドリングが推奨されます。
ファイルが存在していても削除できないケース
以下のようなケースでは unlink()
が失敗します。
- ファイルが読み取り専用で、PHP実行ユーザーに削除権限がない
- ファイルが他プロセスによってロックされている
- パスがディレクトリだった(
unlink()
はファイル専用)
$dir = 'data';
// ディレクトリに対してunlinkすると警告が発生する
unlink($dir); // Warning: unlink(data): Is a directory
ディレクトリ削除には rmdir()
を使う必要があります。
is_file()
と file_exists()
の使い分け
file_exists()
はディレクトリも含めて存在確認を行いますが、is_file()
は純粋にファイルかどうかを判定できます。
$path = 'data/sample.txt';
if (is_file($path)) {
echo "これはファイルです\n";
} elseif (file_exists($path)) {
echo "これはディレクトリです\n";
} else {
echo "存在しません\n";
}
実務では、ファイル操作前に is_file()
で明示的にチェックすることが推奨されます。
4. よくあるミス・誤解・落とし穴
unlink()
をディレクトリに対して実行
誤ってディレクトリパスを渡すと警告が出るため、事前に is_file()
で確認すべきです。
パーミッションエラーの見落とし
unlink()
は対象ファイルだけでなく、親ディレクトリに対する書き込み権限が必要です。特に共有サーバー環境ではこの点で失敗するケースが多く見られます。
ファイルがロックされている
別プロセスがファイルを使用中の場合、unlink()
は沈黙して false
を返すことがあります。ログ出力や明示的なエラー表示が重要です。
5. まとめ
- PHPでは
file_exists()
で存在チェック、unlink()
でファイル削除が可能 - 削除前には
is_file()
でファイル種別の明示確認が安全 - パーミッションやロック状態による削除失敗を考慮し、例外処理を入れることが実務上は必須
- ディレクトリ削除には
rmdir()
を使用する必要がある