"Abhängig vom Dateisystem"
Einige Benutzer erwähnten, dass die Auswirkungen auf die Leistung vom verwendeten Dateisystem abhängen. Na sicher. Dateisysteme wie EXT3 können sehr langsam sein. Aber selbst wenn Sie EXT4 oder XFS verwenden, können Sie nicht verhindern, dass ein Ordner durch ls
oder aufgelistet wirdfind
oder über eine externe Verbindung wie FTP wird langsamer werden ein langsamer.
Lösung
Ich bevorzuge den gleichen Weg wie @armandino . Dafür verwende ich diese kleine Funktion in PHP, um IDs in einen Dateipfad zu konvertieren, der 1000 Dateien pro Verzeichnis ergibt:
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)) . '/';
}
oder Sie können die zweite Version verwenden, wenn Sie alphanumerische Zeichen verwenden möchten:
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)) . '/';
}
Ergebnisse:
<?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
Wie Sie für die sehen können $int
-version sehen können, enthält jeder Ordner bis zu 1000 Dateien und bis zu 99 Verzeichnisse mit 1000 Dateien und 99 Verzeichnissen ...
Vergessen Sie aber nicht, dass zu viele Verzeichnisse die gleichen Leistungsprobleme verursachen!
Schließlich sollten Sie darüber nachdenken, wie Sie die Anzahl der Dateien insgesamt reduzieren können. Abhängig von Ihrem Ziel können Sie CSS-Sprites verwenden, um mehrere kleine Bilder wie Avatare, Symbole, Smilies usw. zu kombinieren. Wenn Sie viele kleine Nicht-Mediendateien verwenden, sollten Sie diese beispielsweise im JSON-Format kombinieren. In meinem Fall hatte ich Tausende von Mini-Caches und schließlich entschied ich mich, sie in 10er-Packs zu kombinieren.