Juste curieux
$files = glob(cacheme_directory()."*");
foreach($files as $file)
{
$filemtime=filemtime ($file);
if (time()-$filemtime>= 172800)
{
unlink($file);
}
}
Je veux juste m'assurer que le code est correct ou non. Merci.
Vous devez ajouter une vérification is_file()
, car PHP répertorie normalement .
ET ..
, ainsi que des sous-répertoires pouvant résider dans le répertoire que vous vérifiez.
En outre, comme cette réponse suggère , vous devez remplacer les secondes précalculées par une notation plus expressive.
<?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);
}
}
}
?>
Vous pouvez également utiliser la variable DirectoryIterator
, comme indiqué dans cette réponse . Dans ce cas simple, cela n'apporte pas vraiment d'avantages, mais ce serait OOP.
Le moyen le plus simple consiste à utiliser 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());
}
}
}
?>
Une autre manière plus simple et plus moderne, en utilisant FilesystemIterator .
J'utilise le répertoire 'logs' comme exemple.
$fileSystemIterator = new FilesystemIterator('logs');
$now = time();
foreach ($fileSystemIterator as $file) {
if ($now - $file->getCTime() >= 60 * 60 * 24 * 2) // 2 days
unlink('logs/'.$file->getFilename());
}
Le principal avantage est: DirectoryIterator renvoie les répertoires virtuels "." et ".." dans une boucle . Mais FilesystemIterator les ignore.
Semble correct pour moi. Je suggérerais simplement de remplacer 172800
par 2*24*60*60
pour plus de clarté.
Sachez que vous rencontrerez des problèmes si vous avez un très grand nombre de fichiers dans le répertoire.
Si vous pensez que cela est susceptible de vous affecter, envisagez une approche de niveau inférieur telle que opendir
.
Voici un exemple de la façon de le faire récursivement.
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);
}
}
J'espère que ça vous aidera.
/** 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);
}
}