【PHP】ディレクトリ内のファイル類をすべて再帰的に削除する
指定したディレクトリ以下にある
- ファイル
- ディレクトリ
を定期的かつ再帰的に削除する方法を紹介しています。
やることは、
- glob関数を使ってディレクトリ内のファイル・ディレクトリのパスを取得
- Linuxコマンドを使って再帰的に削除する
- これをCronで定期的に実行する
です。
ディレクトリ内の削除
Webツールにて、ユーザーがアップロードした画像や動画を一時的にサーバーに保存して加工し、ユーザーに返すツールを作っているのですが、
時間が経つごとにファイルを保存するディレクトリの容量が肥大化してサーバーの容量が圧迫されるため、定期的にディレクトリ内のファイルやディレクトリを再帰的に削除するプログラムをPHPでつくってみました。
PHPプログラム
このプログラムを記述したPHPファイルを、削除したいディレクトリ(この場合「hoge」ディレクトリ)の一つ上の階層において実行してあげれば、「hoge」ディレクトリ以下のファイルやディレクトリが再帰的にすべてごっそり削除されます。
1 2 3 4 5 6 7 8 | <?php foreach ( glob ( "./hoge/*" ) as $file_name ){ //Linuxコマンド $command .= "rm -rf " . realpath ( $file_name ); //指定したファイルを再帰的に削除 //コマンドの実行 exec ( $command ); } ?> |
詳細
上記プログラムの詳細を以下に説明したいと思います。
削除したいファイルやディレクトリを取得
glob関数を使うことで、
- 任意のディレクトリにあるファイルやディレクトリのうち
- 第1引数に指定したpatternにマッチするファイルやディレクトリのパスを配列で取得
することができます。
glob("hoge/*.gif");
この場合、「hoge」ディレクトリ内にある拡張子が「.gif」のファイルのパス名をすべて配列として取得できます。
なお、パターンマッチしなかった場合は配列は空に、失敗した場合はfalseを返します。
※「*」はワイルドカード
ループで処理
削除したいファイルやディレクトリは配列に格納されているためforeach関数で次のように処理してあげます。
1 2 3 4 5 6 | <?php //glob関数を使って「hoge」ディレクトリにある全てのファイルとディレクトリを取得 foreach ( glob ( "./hoge/*" ) as $file_name ){ //「$file_name」には削除したいファイルやディレクトリの相対パスが入っている } ?> |
Linuxコマンドで再帰的に削除
PHPではファイルの削除はunlink関数を使えば容易にできますが、ディレクトリの丸ごと削除はrmdir関数ではできません(削除対象のディレクトリが空である必要がある)。
そのため、空ではないディレクトリを削除する場合は再帰的に削除してあげる必要があるのですが、PHPでLinuxコマンドを叩けば簡単です。
1 2 3 4 | //Linuxコマンド $command .= "rm -rf " . realpath ( $file_name ); //指定したファイルを再帰的に削除 //Linuxコマンドの実行 exec ( $command ); |
ここで注意が必要なのは、rmコマンドに指定するパスは絶対パスにしなければいけないので、realpath関数で相対パスを絶対パスに変換しています。
Cronで定期的に実行
あとは、このPHPプログラムをサーバーのCron機能を使って定期的に実行してあげれば、指定したディレクトリ配下のファイルとディレクトリをごっそりと削除することができます。
あわせて読んでほしい!
コメント
まだコメントはありません。