"Dépend du système de fichiers"
Certains utilisateurs ont mentionné que l'impact sur les performances dépend du système de fichiers utilisé. Bien sûr. Les systèmes de fichiers comme EXT3 peuvent être très lents. Mais même si vous utilisez EXT4 ou XFS, vous ne pouvez pas empêcher que la liste d'un dossier via ls
ou find
ou via une connexion externe comme FTP devienne plus lente et plus lente.
Solution
Je préfère la même manière que @armandino . Pour cela, j'utilise cette petite fonction en PHP pour convertir les identifiants en un chemin de fichier qui génère 1000 fichiers par répertoire:
function dynamic_path($int) {
// 1000 = 1000 files per dir
// 10000 = 10000 files per dir
// 2 = 100 dirs per dir
// 3 = 1000 dirs per dir
return implode('/', str_split(intval($int / 1000), 2)) . '/';
}
ou vous pouvez utiliser la deuxième version si vous souhaitez utiliser des caractères alphanumériques:
function dynamic_path2($str) {
// 26 alpha + 10 num + 3 special chars (._-) = 39 combinations
// -1 = 39^2 = 1521 files per dir
// -2 = 39^3 = 59319 files per dir (if every combination exists)
$left = substr($str, 0, -1);
return implode('/', str_split($left ? $left : $str[0], 2)) . '/';
}
résultats:
<?php
$files = explode(',', '1.jpg,12.jpg,123.jpg,999.jpg,1000.jpg,1234.jpg,1999.jpg,2000.jpg,12345.jpg,123456.jpg,1234567.jpg,12345678.jpg,123456789.jpg');
foreach ($files as $file) {
echo dynamic_path(basename($file, '.jpg')) . $file . PHP_EOL;
}
?>
1/1.jpg
1/12.jpg
1/123.jpg
1/999.jpg
1/1000.jpg
2/1234.jpg
2/1999.jpg
2/2000.jpg
13/12345.jpg
12/4/123456.jpg
12/35/1234567.jpg
12/34/6/12345678.jpg
12/34/57/123456789.jpg
<?php
$files = array_merge($files, explode(',', 'a.jpg,b.jpg,ab.jpg,abc.jpg,ddd.jpg,af_ff.jpg,abcd.jpg,akkk.jpg,bf.ff.jpg,abc-de.jpg,abcdef.jpg,abcdefg.jpg,abcdefgh.jpg,abcdefghi.jpg'));
foreach ($files as $file) {
echo dynamic_path2(basename($file, '.jpg')) . $file . PHP_EOL;
}
?>
1/1.jpg
1/12.jpg
12/123.jpg
99/999.jpg
10/0/1000.jpg
12/3/1234.jpg
19/9/1999.jpg
20/0/2000.jpg
12/34/12345.jpg
12/34/5/123456.jpg
12/34/56/1234567.jpg
12/34/56/7/12345678.jpg
12/34/56/78/123456789.jpg
a/a.jpg
b/b.jpg
a/ab.jpg
ab/abc.jpg
dd/ddd.jpg
af/_f/af_ff.jpg
ab/c/abcd.jpg
ak/k/akkk.jpg
bf/.f/bf.ff.jpg
ab/c-/d/abc-de.jpg
ab/cd/e/abcdef.jpg
ab/cd/ef/abcdefg.jpg
ab/cd/ef/g/abcdefgh.jpg
ab/cd/ef/gh/abcdefghi.jpg
Comme vous pouvez le voir pour la $int
version-chaque dossier contient jusqu'à 1000 fichiers et jusqu'à 99 répertoires contenant 1000 fichiers et 99 répertoires ...
Mais n'oubliez pas que de nombreux répertoires provoquent les mêmes problèmes de performances!
Enfin, vous devriez réfléchir à la façon de réduire le nombre total de fichiers. Selon votre cible, vous pouvez utiliser des sprites CSS pour combiner plusieurs petites images comme des avatars, des icônes, des smileys, etc. ou si vous utilisez de nombreux petits fichiers non multimédias, envisagez de les combiner, par exemple au format JSON. Dans mon cas, j'avais des milliers de mini-caches et j'ai finalement décidé de les combiner en packs de 10.