Obtenir une grande liste de fichiers, sortingés par heure de fichier en * millisecondes *

Je sais que mon système de fichiers stocke l’heure de modification du fichier en millisecondes, mais je ne connais aucun moyen d’accéder à ces informations via PHP. Quand je fais un ls --full-time je vois ceci:

 -rw-r--r-- 1 nobody nobody 900 2012-06-29 14:08:37.047666435 -0700 file1 -rw-r--r-- 1 nobody nobody 900 2012-06-29 14:08:37.163667038 -0700 file2 

Je suppose que les nombres après le point sont les millisecondes.

Donc je me rends compte que je pourrais juste utiliser ls et le faire sortinger par temps de modification, comme ceci:

 $filelist = `ls -t`; 

Cependant, le répertoire contient parfois un grand nombre de fichiers et j’ai remarqué que ls peut être assez lent dans ces circonstances.

Donc, au lieu de cela, j’ai utilisé find mais il n’a pas de commutateur pour sortinger les résultats par heure de modification. Voici un exemple de ce que je fais maintenant:

 $filelist = `find $dir -type f -printf "%T@ %p\n" | sort -n | awk '{print $2}'`; 

Et bien sûr, cela ne se limite pas aux millisecondes, de sorte que les fichiers créés dans la même seconde sont parfois répertoriés dans le mauvais ordre.

Seuls quelques systèmes de fichiers (comme EXT4) stockent effectivement ces temps jusqu’à une précision de l’ordre de la nanoseconde. Ce n’est pas quelque chose qui est garanti pour être disponible, sur d’autres systèmes de fichiers (comme EXT3), vous remarquerez que la partie fractionnaire est .000000000

Maintenant, si cette fonctionnalité est vraiment importante pour vous, vous pouvez écrire une extension PHP spécialisée. Cela contournera les appels aux utilitaires externes et devrait être beaucoup plus rapide. Le processus de création d’une extension est bien expliqué dans de nombreux endroits, comme ici . Une approche raisonnable d’une telle extension pourrait être une implémentation de fonction fstat alternative qui expose les champs de haute précision disponibles dans la structure stat définie dans /usr/include/bits/stat.h de nos jours.

Comme d’habitude, rien n’est gratuit. Cette extension devra être maintenue, il n’est probablement pas possible de l’exécuter sur des environnements hébergés, etc. De plus, votre solution php ne fonctionnera que sur les serveurs sur lesquels votre extension a été déployée (bien que cela puisse se contourner si l’extension n’est pas détectée).