Удалить старые файлы php

Как с помощью PHP удалить директорию со старой датой?

У меня есть папки с файлами, которые называются DIR001, DIR002 и так далее.

В каждой лежит файл DATA.TXT, где внутри файла есть строка 01.02.2023.

Для пользователя формируется страница на основе файлов из конкретной папки. Мне нужно, чтобы данная страница открыла файл DATA.TXT. Сверила дату. Если сегодня 04.02.2023, а в файле 01.02.2023, то данная папка с файлами удаляется. Если сегодня 30.01.2023, а в файле 01.02.2023, то ничего не происходит.

Хочу как-то упразднить процесс удаления старых данных, а то мне приходится вручную контролировать и более 700 папок держать в актуальном состоянии стало просто не реально.

NikolayRostov

Шикарный совет. Сразу виден опыт и большой багаж знаний комментатора. В понедельник свой вопрос выложу на фриланс. Там за 500 рублей молодёжь такие коды пишет, любо-дорого. Профессионалы нервно стоят в сторонке. Да, я не умею с нуля писать коды и этим меня стыдить поздно. Понимание своих недостатков — половина успеха.

P.S. Вот с ошибкой в этом скрипте — добро пожаловать сюда, это будет как раз в теме этого сайта.

NikolayRostov

Adamos

А остановка на половине успеха — провал.
Прежде чем выкладывать на фриланс задачу, которую, скрепя сердце, наколхозят за деньги, почитайте хотя бы первые пару страничек, нагугленных по моему ответу. Ничего особенно сложного там нет, и новых проблем, в отличие от того, что вам подложат на фрилансе, от него не будет.

Adamos

NikolayRostov

Adamos

Николай Ростов, cron — штатный инструмент, выдержавший десятилетия работы на серверах любого уровня.
Если до сих пор с ним не знаком — разберись, а не отмахивайся. Для будущего.
В следующий раз тот же Битрикс тебе заявит, что его агенты нужно перевести на cron (да, даже этот динозавр знает это слово!) — опять будешь говорить «не могу, у меня лапки»?

NikolayRostov

Adamos, у меня свой самописный сайт для хранения документов и обмена ими между собой. Мне супер сложный проект не нужен. Логика простая, в папку загружаются файлы, где информация действительна только до определённого дня. Затем она никому не нужна, так как уже началась работа с новыми сведениями. Пыха достаточно. Если кто-то случайно попадает в старый набор документов, они должны быть уничтожены. Мне Битрикс и другие CMS без надобности. Основная мощность (фильтры, формулы) у каждого пользователя в Access для безопасности персональных данных.

Adamos

Николай Ростов, Access?! Он еще жив.
Нюанс в том, что как раз cron — это и есть самое простое и надежное решение озвученной проблемы.

NikolayRostov

Adamos, cron будет перебирать все папки. Это нагрузка. В период с 10:00 до 14:00 сайт с так работает на 100% мощности. Перебои запрещены. Средний прирост новых папок +30 в день. При этом выходят из оборота 20 в неделю и неравномерно. Какая-то уже завтра не нужна, а какая-то действительна до конца года. К концу этого года их объём увеличится до 3500 штук. При круглосуточном режиме работы нет возможности запускать крон для перебора папок. Поштучный вариант мне кажется самым оптимальным с точки зрения нагрузки.

Читайте также:  Python neural network classification

Access наше всё 🙂 Особенно в бухгалтерии и финансах. Среди нас нет сумасшедших готовых выложить информацию в облако или в интернет. А вот подборки документов из публичных источников, это пожалуйста. Даже если сайт взломают, ничего никто не узнает, так как окончательные решения принимаются переговорами в офлайне.

Adamos

Николай Ростов, судя по восторгу от Акцесса, с Линуксом вы просто не знакомы и не представляете, как смехотворна та «нагрузка», которую вы придумали в оправдание нежелания развиваться.
Примерно так же, как использование офисных приблуд — и мнимая «безопасность», которая на практике оборачивается непременным бардаком, полным отсутствием ролей пользователей и невозможностью найти, кто нагадил в то, что считалось данными, а оказалось — таблицей Ёкселя или файлом Акцесса.

NikolayRostov

Adamos, Мы только от бумажных карточек ушли. Уборщица каждый день две телеги вывозила. Аксэсс и эксель оказались фантастическим прорывом. А бардак у нас всегда был. Никто с ним не борется и не собирается 🙂 Компания приносит прибыль, растёт и все довольны.

Adamos

Николай Ростов, понимаю. Заранее могу порадоваться за вас, какой фантастикой будет открытие CRM 🙂
До того времени — постарайтесь хранить информацию так, чтобы ее можно было прочитать не только Офисом.

Николай Ростов, find создаст не больше нагрузки, чем php-скрипт, а даже меньше. Ведь и тому, и другому придётся прочитать список файлов с диска и затем отправить ему какое-то количество операций удаления. Две основных разницы в том, что, во-первых, find написан на C, а во-вторых, он написан очень эффективно и заточен как раз для подобных задач.

И у файла есть своя собственная дата изменения (mtime), которую можно использовать, не читая какие-то спецфайлы (что ещё и гораздо медленнее).

Совет отказаться от плохого механизма и внедрить хороший — он очень правильный и полезный.

NikolayRostov

Adamos

Николай Ростов, ну-ну, давайте без детских подначек. Мы как раз хорошо представляем, насколько громоздким и ненадежным получится то, что вы задумали, по сравнению с, можно сказать, стандартным решением на кроне.

Николай Ростов, я-то знаю, и даже писал более сложные обходы дерева каталогов, чем в вопросе. Но я делал это именно в тех случаях, когда это было необходимо для конкретной нетривиальной задачи, а не когда мне было лень разобраться в нормальном решении простой.

Источник

Как удалить файлы из каталога на основе даты создания в php?

У меня есть папка с кешем, в которой хранятся файлы html. Они перезаписываются, когда это необходимо, но в то же время в них кэшируются также редко используемые страницы, которые в конечном итоге используют пространство (через 5 недель диск был заполнен более 2,7 миллионами кеш-файлов).

Каков наилучший способ петли через каталог, содержащий несколько сотен тысяч файлов, и удалять файлы старше 1 дня?

Я думаю, вы могли бы это сделать, перейдя через каталог с readdir и удалив на основе метки времени:

Значение if((time() — $filelastmodified) > 24*3600) будет выбирать файлы старше 24 часов (24 часа раз 3600 секунд в час). Если вам нужны дни, он должен читать, например, 7 * 24 * 3600 для файлов старше недели.

Читайте также:  Wordpress include pluggable php on line

Также обратите внимание, что filemtime возвращает время последней модификации файла, а не дату создания.

if((time()-$filelastmodified) > 24*3600 && is_file($file)) 

чтобы избежать ошибок для . и .. каталоги.

Следующая функция перечисляет файл в зависимости от даты создания:

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 ); >> 
// 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.

/* 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); >> 

Я использую это, надеюсь, что это поможет.

просто отметить сравнение времени Гордона (см. выше: https://stackoverflow.com/a/2205833/1875965 ) является единственным правильным при сравнении с «днями», а не «24 часа», поскольку не все дни имеют 24 часа ( летнее время / зима и т. д.).

// setup timezone and get timestamp for yesterday date_default_timezone_set('Europe/Berlin'); // change as appropriate $yesterday = strtotime('-1 day', time()); 

Это может не быть большой проблемой, но может привести к неожиданному поведению, когда вы работаете с неделями / месяцами и т. Д. Я счел, что лучше всего использовать вышеупомянутый метод, поскольку он будет делать любой процесс, связанный с датами / временем, согласованным и избегать спутанность сознания.

Также проверьте, что такое часовой пояс для дат файла, поскольку иногда по умолчанию для PHP отличается от системного часового пояса.

С наилучшими пожеланиями, Сандра.

Изменив решение @ 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); > > 

Источник

Всякий блог

На своих сайтах я использую защиту от копирования контента на основе сессий и в результате на сервере скапливается большое количество каталогов с файлами с номерами сессий. Естественно их приходиться удалять в ручную. Чтобы избавиться от этой рутинной работы я решил автоматизировать процесс с помощью PHP скрипта.

Следующая функция занимается удалением файлов и всех каталогов в указанной директории.
function removeDirectory($dir)
if ($objs = glob($dir.»/*»))
foreach($objs as $obj)
is_dir($obj) ? removeDirectory($obj) : unlink($obj);
>
>
rmdir($dir);
>
?>
Функция нужна для того чтобы удалять как папки так и вложенные файлы, так как rmdir умеет удалять только пустые каталоги.

Читайте также:  Добавить в исключение java

Далее нам необходимо определить все каталоги которые содержаться в указанной директории и после проверки на текущую и каталог уровня выше текущего («.» и «..»), что бы ненароком не затереть и весь свой сайт выполняем функцию которая описана выше.

if ($handle = opendir(‘../temp/’)) while (false !== ($entry = readdir($handle))) if ($entry != «.» && $entry != «..») $time_sec=time();
$time_file=filemtime(«../temp/$entry»);
$time=($time_sec-$time_file)/60;
if($time > 30)
removeDirectory(«../temp/$entry»);
>
>
>
closedir($handle);
>
?>

В текущем скрипте идет проверка на удаление каталогов которые старше 30 минут если нужно выбрать другое время то можно изменить условие if($time > 30)

Далее остается только добавить задание в cron. Но в случае с cron’ ом в скрипте необходимо указывать полные пути к папке так как задание запуститься, но файлы удалены не будут.

Источник

Правильный способ удаления всех файлов старше 2 дней в PHP

Я просто хочу убедиться, что код правильный или нет. Спасибо.

8 ответов

вы должны добавить is_file() проверьте, потому что PHP обычно перечисляет . и .. , а также подкаталоги, которые могут находиться в каталоге, который вы проверяете.

также, как этот ответ предполагает, вы должны заменить предварительно рассчитанные секунды более выразительной нотацией.

в качестве альтернативы вы также можете использовать DirectoryIterator , как показано в этот ответ. В этом простом случае на самом деле не предлагает никаких преимуществ, но это будет путь ООП.

самый простой способ-использовать DirectoryIterator:

другой более простой и современный способ, используя FilesystemIterator.

в качестве примера я использую каталог «logs».

$fileSystemIterator = new FilesystemIterator('logs'); $now = time(); foreach ($fileSystemIterator as $file) < if ($now - $file->getCTime() >= 60 * 60 * 24 * 2) // 2 days unlink('logs/'.$file->getFilename()); > 

главное преимущество: DirectoryIterator возвращает виртуальные каталоги «.» и.» .- в петле. Но FilesystemIterator игнорирует их.

выглядит правильным для меня. Я просто предлагаю вам заменить 172800 с 2*24*60*60 для ясности.

имейте в виду, что вы столкнетесь с проблемами, если у вас очень большое количество файлов в каталоге.

Если вы думаете, что это может повлиять на вас, попробуйте снизить подхода, такие как opendir .

вот пример того, как это сделать рекурсивно.

function remove_files_from_dir_older_than_x_seconds($dir,$seconds = 3600) < $files = glob(rtrim($dir, '/')."/*"); $now = time(); foreach ($files as $file) < if (is_file($file)) < if ($now - filemtime($file) >= $seconds) < echo "removed $file
".PHP_EOL; unlink($file); > > else < remove_files_from_dir_older_than_x_seconds($file,$seconds); >> > remove_files_from_dir_older_than_x_seconds(dirname(__file__).'/cache/', (60 * 60 * 24 * 1) ); // 1 day
/* Delete 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() - 172800) < // 2 days unlink($file); >> 
/** It deletes old files. * @param string $dir Directory * @param int $secs Files older than $secs seconds * @param string $pattern Files matching $pattern */ function delete_oldfiles($dir,$secs,$pattern = "/*") < $now = time(); foreach(glob("$dir$pattern") as $f) < if (is_file($f) && ($now - filemtime($f) >$secs)) unlink($f); > > 

Источник

Оцените статью