Intereting Posts
Доступ к значению массива внутри объекта в PHP Как предоставить каждому зарегистрированному пользователю собственный URL-адрес с помощью PHP? Папки и файлы не отображаются в PHP Explorer в Eclipse IDE Разница между уровнем доступа к данным и моделью в MVC Как найти месяц нет, имя из номера недели, используя php Шаблон DataMapper PHP: моему классу нужен экземпляр PDO, я хочу обернуть его внутри класса Db Добавить миниатюру продукта в мой аккаунт – Последние заказы – Woocommerce Включить файлы с оператором switch $ _GET? Как вставить новую пару ключевых значений в массив в php? Загрузите содержимое URL-адреса в PHP, даже если оно возвращает 404 Обработка Javascript потока октетов php readfile Размытие строки одним или несколькими пробелами или вкладками фильтр диапазона времени на конечной точке объявлений (API Facebook) Запросить сущность слишком большого PHP Отправить номер, используя форму HTML в Laravel

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

Просто любопытно

$files = glob(cacheme_directory()."*"); foreach($files as $file) { $filemtime=filemtime ($file); if (time()-$filemtime>= 172800) { unlink($file); } } 

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

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

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

 <?php $files = glob(cacheme_directory()."*"); $now = time(); foreach ($files as $file) { if (is_file($file)) { if ($now - filemtime($file) >= 60 * 60 * 24 * 2) { // 2 days unlink($file); } } } ?> 

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

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

 <?php if (file_exists($folderName)) { foreach (new DirectoryIterator($folderName) as $fileInfo) { if ($fileInfo->isDot()) { continue; } if ($fileInfo->isFile() && time() - $fileInfo->getCTime() >= 2*24*60*60) { unlink($fileInfo->getRealPath()); } } } ?> 

Еще один более простой и более современный способ использования FilesystemIterator .

В качестве примера я использую каталог журналов.

 $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<br>".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); } }