У меня есть папка кэша, которая хранит файлы HTML. Они перезаписываются при необходимости, но много времени, редко используемые страницы кэшируются там также, которые только заканчивают тем, что использовали пространство (после того, как 5 недель, диск был полон более чем 2,7 миллионов файлов кэша).
Что лучший способ состоит в том, чтобы циклично выполнить через каталог, который содержит несколько сотен тысяч файлов, и удалите файлы, которые являются более старыми, чем 1 день?
Я думаю, вы могли бы сделать это, проходя по каталогу с помощью readdir и удаляя на основе временной метки:
<?php
$path = '/path/to/files/';
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
$filelastmodified = filemtime($path . $file);
//24 hours in a day * 3600 seconds per hour
if((time() - $filelastmodified) > 24*3600)
{
unlink($path . $file);
}
}
closedir($handle);
}
?>
The if((time() - $filelastmodified) > 24*3600)
будет выбирать файлы старше 24 часов (24 часа умножить на 3600 секунд в час). Если вам нужны дни, то для файлов старше недели это должно читаться, например, 7*24*3600.
Также обратите внимание, что filemtime
возвращает время последней модификации файла, а не дату создания.
Попробуйте SplIterators
// setup timezone and get timestamp for yesterday
date_default_timezone_set('Europe/Berlin'); // change to yours
$yesterday = strtotime('-1 day', time());
// setup path to cache dir and initialize iterator
$path = realpath('/path/to/files'); // change to yours
$objects = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path));
// iterate over files in directory and delete them
foreach($objects as $name => $object){
if ($object->isFile() && ($object->getCTime() < $yesterday)) {
// unlink($object);
echo PHP_EOL, 'deleted ' . $object;
}
}
Приведенная ниже функция выводит список файлов на основе даты их создания:
private function listdir_by_date( $dir ){
$h = opendir( $dir );
$_list = array();
while( $file = readdir( $h ) ){
if( $file != '.' and $file != '..' ){
$ctime = filectime( $dir . $file );
$_list[ $file ] = $ctime;
}
}
closedir( $h );
krsort( $_list );
return $_list;
}
Пример:
$_list = listdir_by_date($dir);
Теперь вы можете прокручивать список, чтобы увидеть их даты и удалите соответственно:
$now = time();
$days = 1;
foreach( $_list as $file => $exp ){
if( $exp < $now-60*60*24*$days ){
unlink( $dir . $file );
}
}