Просто любопытно
$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); } }