"Depende del sistema de archivos"
Algunos usuarios mencionaron que el impacto en el rendimiento depende del sistema de archivos utilizado. Por supuesto. Los sistemas de archivos como EXT3 pueden ser muy lentos. Pero incluso si se utiliza EXT4 o XFS no se puede impedir que la inclusión de una carpeta a través ls
o find
oa través de una conexión externa como FTP será más lento el más lento.
Solución
Prefiero lo mismo que @armandino . Para eso utilizo esta pequeña función en PHP para convertir ID en una ruta de archivo que da como resultado 1000 archivos por directorio:
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)) . '/';
}
o puede usar la segunda versión si desea usar caracteres alfanuméricos:
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)) . '/';
}
resultados:
<?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
Como puede ver en la $int
versión-cada carpeta contiene hasta 1000 archivos y hasta 99 directorios que contienen 1000 archivos y 99 directorios ...
¡Pero no olvide que muchos directorios causan los mismos problemas de rendimiento!
Finalmente, debe pensar en cómo reducir la cantidad de archivos en total. Dependiendo de su objetivo, puede usar sprites CSS para combinar múltiples imágenes pequeñas como avatares, iconos, emoticones, etc. o si usa muchos archivos pequeños que no son medios, considere combinarlos, por ejemplo, en formato JSON. En mi caso, tenía miles de mini cachés y finalmente decidí combinarlos en paquetes de 10.