"Dosya sistemine bağlıdır"
Bazı kullanıcılar performans etkisinin kullanılan dosya sistemine bağlı olduğunu belirttiler. Elbette. EXT3 gibi dosya sistemleri çok yavaş olabilir. Ancak EXT4 veya XFS kullansanız bile, bir klasör üzerinden ls
veya find
FTP gibi harici bir bağlantı üzerinden bir klasör listelemenin daha yavaş olmasını engelleyemezsiniz .
Çözüm @armandino ile
aynı şekilde tercih ederim . Bunun için ben PHP bu küçük işlevi kimlikleri dizin başına 1000 dosya sonuçları bir dosya yoluna dönüştürmek için kullanın:
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)) . '/';
}
veya alfa-sayısal karakterler kullanmak isterseniz ikinci sürümü kullanabilirsiniz:
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)) . '/';
}
Sonuçlar:
<?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
-Version için de görebileceğiniz gibi her klasör 1000 dosya ve 1000 dosya ve 99 dizin içeren 99 dizin içerir ...
Ancak birçok dizinde aynı performans sorunlarına neden olduğunu unutmayın!
Son olarak, toplam dosya miktarını nasıl azaltacağınızı düşünmelisiniz. Hedefinize bağlı olarak, avatarlar, simgeler, ifadeler vb. Gibi birden fazla küçük resmi birleştirmek için CSS spritelarını kullanabilirsiniz veya çok sayıda küçük medya olmayan dosya kullanıyorsanız bunları JSON biçiminde birleştirmeyi düşünebilirsiniz. Benim durumumda binlerce mini önbellek vardı ve sonunda onları 10'luk paketler halinde birleştirmeye karar verdim.