예제 #1
0
파일: FileCtl.php 프로젝트: poppen/p2
 /**
  * いわゆるひとつのガベコレ
  *
  * $targetDirから最終更新より$lifeTime秒以上たったファイルを削除
  *
  * @access  public
  * @param   string   $targetDir  ガーベッジコレクション対象ディレクトリ
  * @param   integer  $lifeTime   ファイルの有効期限(秒)
  * @param   string   $prefix     対象ファイル名の接頭辞(オプション)
  * @param   string   $suffix     対象ファイル名の接尾辞(オプション)
  * @param   boolean  $recurive   再帰的にガーベッジコレクションするか否か(デフォルトではFALSE)
  * @return  array|false    削除に成功したファイルと失敗したファイルを別々に記録した二次元の配列
  */
 function garbageCollection($targetDir, $lifeTime, $prefix = '', $suffix = '', $recursive = FALSE)
 {
     if (!strlen($targetDir)) {
         return false;
     }
     $result = array('successed' => array(), 'failed' => array(), 'skipped' => array());
     $expire = time() - $lifeTime;
     //ファイルリスト取得
     if ($recursive) {
         $list = FileCtl::scandirR($targetDir);
         if ($list === false) {
             return false;
         }
         $files =& $list['files'];
     } else {
         $list = scandir($targetDir);
         $files = array();
         $targetDir = realpath($targetDir) . DIRECTORY_SEPARATOR;
         foreach ($list as $filename) {
             if ($filename == '.' || $filename == '..') {
                 continue;
             }
             $files[] = $targetDir . $filename;
         }
     }
     //検索パターン設定($prefixと$suffixにスラッシュを含まないように)
     if ($prefix || $suffix) {
         $prefix = is_array($prefix) ? implode('|', array_map('preg_quote', $prefix)) : preg_quote($prefix);
         $suffix = is_array($suffix) ? implode('|', array_map('preg_quote', $suffix)) : preg_quote($suffix);
         $pattern = '/^' . $prefix . '.+' . $suffix . '$/';
     } else {
         $pattern = '';
     }
     //ガベコレ開始
     foreach ($files as $filename) {
         if ($pattern && !preg_match($pattern, basename($filename))) {
             //$result['skipped'][] = $filename;
             continue;
         }
         if (filemtime($filename) < $expire) {
             if (@unlink($filename)) {
                 $result['successed'][] = $filename;
             } else {
                 $result['failed'][] = $filename;
             }
         }
     }
     return $result;
 }