„Zależy od systemu plików”
Niektórzy użytkownicy wspomnieli, że wpływ na wydajność zależy od używanego systemu plików. Oczywiście. Systemy plików takie jak EXT3 mogą być bardzo wolne. Ale nawet jeśli używasz EXT4 lub XFS nie można zapobiec poprzez wystawianie folder ls
lub find
lub za pośrednictwem połączenia zewnętrznych, takich jak FTP staną się wolniejsze wolniej.
Rozwiązanie
Wolę tak samo jak @armandino . W tym celu używam tej małej funkcji w PHP do konwertowania identyfikatorów na ścieżkę pliku, która daje 1000 plików w katalogu:
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)) . '/';
}
lub możesz użyć drugiej wersji, jeśli chcesz użyć znaków alfanumerycznych:
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)) . '/';
}
wyniki:
<?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
Jak widać dla $int
-wersji, każdy folder zawiera do 1000 plików i do 99 katalogów zawierających 1000 plików i 99 katalogów ...
Ale nie zapominaj, że wiele katalogów powoduje te same problemy z wydajnością!
Wreszcie powinieneś pomyśleć o tym, jak zmniejszyć całkowitą liczbę plików. W zależności od celu możesz używać duszków CSS do łączenia wielu małych obrazów, takich jak awatary, ikony, emotikony itp. Lub jeśli używasz wielu małych plików innych niż media, rozważ połączenie ich np. W formacie JSON. W moim przypadku miałem tysiące mini-skrzynek i ostatecznie postanowiłem połączyć je w paczkach po 10.