"Tergantung pada sistem file"
Beberapa pengguna menyebutkan bahwa dampak kinerja tergantung pada sistem file yang digunakan. Tentu saja. Filesystem seperti EXT3 bisa sangat lambat. Tetapi bahkan jika Anda menggunakan EXT4 atau XFS Anda tidak dapat mencegah bahwa daftar folder melalui ls
atau find
atau melalui koneksi eksternal seperti FTP akan menjadi lebih lambat lebih lambat.
Solusi
Saya lebih suka cara yang sama dengan @armandino . Untuk itu saya menggunakan fungsi kecil ini di PHP untuk mengubah ID menjadi filepath yang menghasilkan 1000 file per direktori:
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)) . '/';
}
atau Anda bisa menggunakan versi kedua jika Anda ingin menggunakan karakter alfa-numerik:
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)) . '/';
}
hasil:
<?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
Seperti yang Anda lihat untuk versi- $int
setiap folder berisi hingga 1000 file dan hingga 99 direktori yang berisi 1000 file dan 99 direktori ...
Tetapi jangan lupa bahwa banyak direktori menyebabkan masalah kinerja yang sama!
Akhirnya Anda harus memikirkan cara mengurangi jumlah file secara total. Bergantung pada target Anda, Anda dapat menggunakan sprite CSS untuk menggabungkan beberapa gambar kecil seperti avatar, ikon, smilies, dll. Atau jika Anda menggunakan banyak file kecil non-media pertimbangkan untuk menggabungkannya misalnya dalam format JSON. Dalam kasus saya, saya memiliki ribuan cache mini dan akhirnya saya memutuskan untuk menggabungkannya dalam paket 10.