8768 sujets

Développement web côté serveur, CMS

Bonsoir,

je voudrais conserver, à chaque upload, les 6 fichiers les plus récents de mon répertoire Uploads. La fonction php suivante vous parait-elle optimisée ?

function uploads_rajeunir()
{
$scandir = scandir( "Uploads" ) ; 
$liste = array() ;

foreach( $scandir as $nom ) if( is_file( "Uploads/$nom" ) ) $liste[filemtime( "Uploads/$nom" )] = $nom;
 
krsort( $liste, SORT_NUMERIC ) ;
$liste = array_values( $liste ) ; 
foreach( $liste as $n => $file ) if( $n > 5 ) unlink( "Uploads/$file" ) ;
}
Bonjour,

Les 5 premiers tours du 2ème foreach sont inutiles, on pourrait directement utiliser une boucle for à partir du 6ème élément de la liste (plus besoin d'utiliser array_values dans ce cas). Néanmoins ton code actuel semble correct et ca ne devrait pas faire une grande différence en terme d'optimisation.

Idéalement il faudrait vérifier que scandir ne renvoie pas le valeur false pour éviter une éventuelle erreur avec le premier foreach (dans le cas où le dossier n'existe pas ou n'est pas accessible en lecture par exemple).

function uploads_rajeunir()
{
	$scandir = scandir("Uploads") ; 
	$liste = [];
	
	if ($scandir) {
		foreach ($scandir as $nom) {
			if(is_file("Uploads/$nom")) {
				$liste[filemtime("Uploads/$nom")] = $nom;
			}
		}
		 
		krsort($liste, SORT_NUMERIC);
		$total = count($liste);
		
		for ($i = 5; $i < $total; $i++) {
			unlink("Uploads/".$liste[$i]);
		}
	}
}

Modifié par Pitet (08 Jul 2022 - 14:02)

function uploads_rajeunir()
{
	$scandir = scandir("Uploads") ; 
	$liste = [];
	
	if ($scandir) {
		foreach ($scandir as $nom) {
			if(is_file("Uploads/$nom")) {
				$liste[filemtime("Uploads/$nom")] = $nom;
			}
		}
		 
		krsort($liste, SORT_NUMERIC);
		$total = count($liste);
		
		for ($i = 5; $i < $total; $i++) {
			unlink("Uploads/".$liste[$i]);
		}
	}
}


Bonjour ! Et merci de t'intéresser à ma question.

Je crois que ton code est fautif : les index de $liste sont des timestamps, pas des entiers !!!
Bien vu ! Ca m'apprendra à ne pas tester ! Du coup on peut continuer d'utiliser array_values pour parcourir le tableau dans la 2e boucle.

Le fait de placer les dates de modification en clé du tableau pour ensuite utiliser krsort n'est pas une mauvaise idée, mais ceci pourrait poser problème si deux fichiers ont la même date de modification, un des deux fichiers sera donc ignoré (écrasé dans le tableau $liste).
Bonsoir, Pitet !

Pitet a écrit :

Le fait de placer les dates de modification en clé du tableau pour ensuite utiliser krsort n'est pas une mauvaise idée, mais ceci pourrait poser problème si deux fichiers ont la même date de modification, un des deux fichiers sera donc ignoré (écrasé dans le tableau $liste).


Effectivement, si plusieurs fichiers ont le même timestamp, il va y avoir de l'écrasement dans $liste.

Néanmoins :
* dans la pratique, se produit-ce couramment ?
* il ne s'agit que de ménage; pas d'envoyer des Terriens sur Mars.

Bonne soirée !
dagobert a écrit :

* dans la pratique, se produit-ce couramment ?

Seul toi peux savoir si ceci risque de se produire selon le contexte d'utilisation de ton application (est-il probable que 2 fichiers soit uploadés en même temps ?).

Si on veut éviter ce risque, on peut utiliser une autre manière de trier les fichiers du dossier (via usort par exemple).
Dans le cas contraire, ton premier code est suffisant pour faire le ménage (dans le doute on aura toujours une éventuelle sauvegarde pour restaurer les fichiers supprimés par erreur bien sûr Smiley cligne ).