Правильный способ удаления всех файлов старше 2 дней в PHP
Просто любопытно
$files = glob(cacheme_directory()."*");
foreach($files as $file)
{
$filemtime=filemtime ($file);
if (time()-$filemtime>= 172800)
{
unlink($file);
}
}
Я просто хочу убедиться, что код правильный или нет. Спасибо.
Ответы
Ответ 1
Вы должны добавить проверку 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
, как показано в этом ответе. В этом простом случае это не дает никаких преимуществ, но это будет ООП.
Ответ 2
Самый простой способ - использовать 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());
}
}
}
?>
Ответ 3
Другой более простой и более современный способ, используя 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 игнорирует их.
Ответ 4
Похоже на меня. Я просто предлагаю вам заменить 172800
на 2*24*60*60
для ясности.
Ответ 5
Помните, что у вас возникнут проблемы, если в каталоге имеется очень большое количество файлов.
Если вы считаете, что это может повлиять на вас, рассмотрите подход более низкого уровня, например opendir
.
Ответ 6
Вот пример того, как это сделать рекурсивно.
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
Ответ 7
/* 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);
}
}
Надеюсь, он вам поможет.
Ответ 8
/** 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);
}
}