"Залежить від файлової системи"
Деякі користувачі зазначили, що ефективність роботи залежить від використовуваної файлової системи. Звичайно. Такі файлові системи, як EXT3, можуть бути дуже повільними. Але навіть якщо ви використовуєте EXT4 або XFS ви не можете запобігти , що лістинг папки через ls
або find
або через зовнішнє з'єднання , як FTP буде повільніше повільніше.
Рішення
я віддаю перевагу так само, як @armandino . Для цього я використовую цю маленьку функцію в PHP для перетворення ідентифікаторів у файловий шлях, що призводить до 1000 файлів у каталозі:
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)) . '/';
}
або ви можете використовувати другу версію, якщо хочете використовувати буквено-цифрові символи:
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)) . '/';
}
результати:
<?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
Як ви бачите для $int
-версії, кожна папка містить до 1000 файлів і до 99 каталогів, що містять 1000 файлів і 99 каталогів ...
Але не забувайте, що для багатьох каталогів виникають однакові проблеми з роботою!
Нарешті, слід подумати про те, як зменшити загальну кількість файлів. Залежно від цілі ви можете використовувати CSS-спрайти для комбінування декількох крихітних зображень, таких як аватари, піктограми, посмішки тощо, або якщо ви використовуєте багато невеликих немедіа-файлів, розглядайте можливість їх поєднання, наприклад, у форматі JSON. У моєму випадку у мене було тисячі міні-кешів і, нарешті, я вирішив об'єднати їх у 10 пачок.