Как удалить файлы из каталога на основе даты создания в php?
У меня есть папка с кешем, в которой хранятся html файлы. Они перезаписываются, когда это необходимо, но в то же время в них кэшируются и редко используемые страницы, которые просто используют пространство (через 5 недель диск был заполнен более чем 2,7 миллионами кеш файлов).
Каков наилучший способ петли через каталог, содержащий несколько сотен тысяч файлов, и удалять файлы старше 1 дня?
Ответы
Ответ 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);
}
?>
if((time() - $filelastmodified) > 24*3600)
будет выбирать файлы старше 24 часов (24 часа раз 3600 секунд в час). Если вам нужны дни, он должен читать, например, 7 * 24 * 3600 для файлов старше недели.
Также обратите внимание, что filemtime
возвращает время последней модификации файла вместо даты создания.
Ответ 2
Это должно быть
if((time()-$filelastmodified) > 24*3600 && is_file($file))
чтобы избежать ошибок для каталогов .
и ..
.
Ответ 3
Следующая функция перечисляет файл в зависимости от даты создания:
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 );
}
}
Ответ 4
Попробуйте 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;
}
}
Время создания доступно только в Windows.
Ответ 5
/* Detele Cache Files Here */
$dir = "cache/"; /** define the directory **/
/*** cycle through all files in the directory ***/
foreach (glob($dir."*") as $file) {
//foreach (glob($dir.'*.*') as $file){
/*** if file is 24 hours (86400 seconds) old then delete it ***/
if (filemtime($file) < time() - 3600) { // 1 hour
unlink($file);
}
}
Я использую это, надеюсь, что это поможет.
Ответ 6
просто отметить сравнение времени Гордона (см. выше: fooobar.com/questions/199880/...) является единственным правильным при сравнении с "днями", а не "24 часа", так как не все дни имеют 24 часа (летнее/зимнее время и т.д.).
например. использовать
// setup timezone and get timestamp for yesterday
date_default_timezone_set('Europe/Berlin'); // change as appropriate
$yesterday = strtotime('-1 day', time());
при сравнении даты файла.
Это может быть не большая проблема, но может привести к неожиданному поведению, когда вы работаете с неделями/месяцами и т.д. Я нашел, что лучше всего использовать этот метод, поскольку он будет делать любой процесс, связанный с датами/временем и избегать путаницы.
Также проверьте, что такое часовой пояс для дат файла, поскольку иногда по умолчанию для PHP отличается от системного часового пояса.
С уважением, Сандра.
Ответ 7
Изменив решение @pawel, я создал функцию ниже.
Сначала я забыл добавить "путь" к имени файла, на который уходит полчаса, чтобы узнать.
public function deleteOldFiles ($hours=24) {
$path='cache'.DS;
if ( $handle = opendir( $path ) ) {
while (false !== ($file = readdir($handle))) {
$filelastmodified = filemtime($path.$file);
if((time()-$filelastmodified) > 24*3600 && is_file($path.$file))
{
unlink($path.$file);
}
}
closedir($handle);
}
}