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