/** * いわゆるひとつのガベコレ * * $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; }