PHPプログラムに関する各種メモ書き

phpでx日経過した古いファイルやディレクトリを削除する

テンポラリファイルなど、何日か前のファイルを削除したい時があると思います。

●PHPでファイル、ディレクトリ一覧を取得する

例:my_folder 以下のファイル、ディレクトリ一覧を取得します。

$dir = dirname(__FILE__) . '/my_folder/';  
$list = get_file_dir_list($dir);  
// get_file_dir_list
function get_file_dir_list($dir=''){
  if ( !$dir || !is_dir($dir) ){ die('dirを正しく設定してください。');}
  $iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator(
      $dir,
      FilesystemIterator::SKIP_DOTS
      |FilesystemIterator::KEY_AS_PATHNAME
      |FilesystemIterator::CURRENT_AS_FILEINFO
    ), RecursiveIteratorIterator::CHILD_FIRST
  );
  $list = array();
  foreach($iterator as $pathname => $info){
    $list[] = $pathname;
  }
  return $list;
}

●X日経過したファイル、ディレクトリを削除する

例:my_folder 以下のファイル、ディレクトリから1ヶ月以上前のものは削除します。

$list = get_file_dir_list($dir);  
print_r($list);  
del_file_dir($list, '-1 month');  
// del_file_dir
function del_file_dir( $list=array(), $expire_date_str='-1 month' ){
  //削除期限
  date_default_timezone_set('Asia/Tokyo');
  $expire_timestamp = 0;
  if (($expire_timestamp = strtotime($expire_date_str)) === false) { die("The expire string : ({$expire_date_str}) is bogus"); }

  foreach ($list as $file_path) {
   if ( preg_match("/\.gitkeep/", $file_path) ){ continue; } // .gitkeep は削除しない
    $mod = filemtime( $file_path );
    if($mod < $expire_timestamp){
      if (is_dir($file_path)){
        echo 'ディレクトリ削除します : '. $file_path.date("Y-m-d H:i:s", $mod)."\n";
        rmdir($file_path) or die("can not delete directory:({$file_path})");
      }
      if (is_file($file_path)){
        echo 'ファイル削除します : '. $file_path.date("Y-m-d H:i:s", $mod)."\n";
        unlink($file_path) or die("can not delete file:({$file_path})");
      }
    }
  }
}
No.1022
12/08 16:48

edit