2012-01-22 11 views
27

Solo curiosoIl modo corretto per eliminare tutti i file più vecchi di 2 giorni in PHP

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

Voglio solo essere sicuro se il codice è corretto o meno. Grazie.

+3

Hai provato? – buschtoens

+2

si prega di utilizzare la funzione di ricerca prima di chiedere http://stackoverflow.com/search?q=delete+files+older+php – Gordon

+2

possibile duplicato di [Come eliminare i file dalla directory in base alla data di creazione in php] (http: // stackoverflow.com/questions/2205738/how-to-delete-files-from-directory-based-on-creation-date-in-php) – Gordon

risposta

61

È necessario aggiungere un controllo is_file(), poiché in genere il PHP elenca . and .. e le sottodirectory che potrebbero risiedere nella directory che si sta verificando.

Inoltre, come this answer suggests, è necessario sostituire i secondi precalcolati con una notazione più espressiva.

<?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); 
     } 
    } 
    } 
?> 

In alternativa si potrebbe anche utilizzare il DirectoryIterator, as shown in this answer. In questo semplice caso non offre alcun vantaggio, ma sarebbe OOP.

+1

Ottimo punto. +1 – Oldskool

+2

Funziona come un incantesimo, ma perché tu le persone escludono sempre le parentesi {} Io le adoro: D non posso farne a meno. Altrimenti il ​​codice è nudo – Luka

+0

Hai davvero bisogno di aggiungere i backets. Questo codice non è leggibile e ordinato. – Gfra54

3

Sembra corretto per me. Ti suggerisco semplicemente di sostituire 172800 con 2*24*60*60 per chiarezza.

+20

o aggiungi semplicemente "// 2 giorni" accanto, per una maggiore chiarezza – mrlee

2

Tenere presente che si incontrano problemi se si dispone di un numero molto elevato di file nella directory.

Se ritieni che questo possa influire su di te, considera l'utilizzo di un approccio di livello inferiore come opendir.

+0

Vedrò che +1 –

+1

In quali tipi di problemi potremmo incorrere? – vertigoelectric

+0

@vertigoelectric esaurimento dei problemi di memoria – DarkSide

37

Il modo più semplice è quello di utilizzare 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()); 
     } 
    } 
} 
?> 
+5

Questo funziona per me, ma è leggermente più veloce se si calcola semplicemente time() e 2 * 24 * 60 * 60 una volta prima del ciclo while e si usano variabili nel ciclo. –

+0

Vorrei solo dire grazie. Questo onestamente dovrebbe essere la risposta scelta. –

+0

funziona alla grande e ho imparato a conoscere DirectoryIterator che è fantastico! –

5

Un altro più semplice e più moderno modo, utilizzando FilesystemIterator.

Sto usando la directory 'logs' come esempio.

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

vantaggio principale è: DirectoryIterator ritorna directory virtuali "" e ".." in un ciclo. Ma FilesystemIterator li ignora.

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

Spero che ti aiuti.

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

Ecco un esempio di come farlo in modo ricorsivo.

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 
Problemi correlati