PHPでファイルを削除するサンプルを作成したのでここにメモしておきます。
単純にファイルを削除するだけだと利用用途が狭いので、ファイルの最終更新日を見て過去分のもののみ削除するようなサンプルを作成しました。
今回検証したPHPのバージョンは「7.2.12」になります。
この記事の内容
- ファイルの最終更新日が過去のファイルを削除するサンプルプログラム
サンプルソース
以下がサンプルとなります。
関数かしているので、利用する場合は共通関数的な形で使ってください。
/**
* ファイルの一括削除
* @var array $file_list 削除対象のファイル一覧
* @var int $term 削除対象の経過日数を指定
* (example)
* 「1」:1日以上経過しているファイルを削除
* 「7」:1週間(7日間)以上経過しているファイルを削除
* 指定しない場合はすべて削除
* @return boolean ファイルの削除の成功・失敗
*/
public function deleteAll($file_list=array(), $term=NULL) {
// タイムゾーンの設定
date_default_timezone_set('Asia/Tokyo');
$delete_term = 0;
// ファイルの削除期間を解析
if(!empty($term)) {
// 数値文字列や文字列の場合はエラー
if (!is_int($term)) return false;
// 日単位の削除期間のUnixタイムスタンプを算出
// 60秒 * 60分 * 24時間 * 指定した日にち
$delete_term = time() - (60*60*24*$term);
}
foreach($this->file_list as $file) {
// 削除対象の最終更新日をUnixタイムスタンプで取得
$file_mod = filemtime( $file );
echo "{$file_mod} < {$delete_term}\r\n";
// 対象ファイルの最終更新日が指定日より過去日の場合は削除する
if ($delete_term !== 0 || $file_mod >= $delete_term) continue;
// ファイルの存在チェック
if(!is_file($file_path)) return false;
// ファイルの削除
unlink($file_path);
}
return true;
}
// 利用例
// 削除対象はファイルパスを配列化しておく
$file_list = array(
"/home/user/test01.csv"
,"/home/user/test02.csv"
,"/var/tmp/test/test03.csv"
,"/var/tmp/test04.csv"
);
// 3日前のファイルを削除する例
$this->deleteAll($file_list, 3);
使い方として、deleteAll関数の引数に削除対象のファイルパスの配列と、削除する場合の経過日数を指定することで、経過日数より過去に更新されたファイルが削除される仕組みになっています。
ファイルの最終更新日を取得する際はfilemtime関数を使います。取得される値はUnixタイムスタンプなので注意してください。Unixタイムスタンプの説明は過去記事にちょっと出てきていたので今回は割愛します。
比較対象の日付はtime関数を使って、現在の時刻から経過日数を差し引いたUnixタイムスタンプを算出しています。time関数以外にもstrtotime関数で代用することも可能です。
個人的に不完全燃焼な部分が月単位の指定ができないことです。
上のサンプルだど日単位の指定しかできないため、正確に1ヶ月前の削除ができません。
そもそも月ごと日数が違うし、閏年なんかもあるため、正確に実行日の1ヶ月前を取るのが難しかったです。....が余裕があったら考えてみます。<(_ _)>