"Phụ thuộc vào hệ thống tệp"
Một số người dùng đã đề cập rằng tác động hiệu suất phụ thuộc vào hệ thống tệp được sử dụng. Tất nhiên. Các hệ thống tập tin như EXT3 có thể rất chậm. Nhưng ngay cả khi bạn sử dụng EXT4 hoặc XFS bạn không thể ngăn chặn điều đó liệt kê một thư mục thông qua ls
hoặc find
hoặc thông qua một kết nối bên ngoài như FTP sẽ trở nên chậm hơn một chậm hơn.
Giải pháp
tôi thích cách tương tự như @armandino . Vì vậy, tôi sử dụng hàm nhỏ này trong PHP để chuyển đổi ID thành filepath cho kết quả 1000 tệp trên mỗi thư mục:
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)) . '/';
}
hoặc bạn có thể sử dụng phiên bản thứ hai nếu bạn muốn sử dụng các ký tự chữ và số:
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)) . '/';
}
các kết quả:
<?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
Như bạn có thể thấy đối với $int
-version mỗi thư mục chứa tối đa 1000 tệp và tối đa 99 thư mục chứa 1000 tệp và 99 thư mục ...
Nhưng đừng quên rằng nhiều thư mục gây ra các vấn đề hiệu suất tương tự!
Cuối cùng, bạn nên suy nghĩ về cách giảm tổng số lượng tệp. Tùy thuộc vào mục tiêu của bạn, bạn có thể sử dụng các họa tiết CSS để kết hợp nhiều hình ảnh nhỏ như hình đại diện, biểu tượng, mặt cười, v.v. hoặc nếu bạn sử dụng nhiều tệp không phải phương tiện nhỏ, hãy xem xét kết hợp chúng, ví dụ như ở định dạng JSON. Trong trường hợp của tôi, tôi đã có hàng ngàn bộ nhớ cache nhỏ và cuối cùng tôi quyết định kết hợp chúng thành gói 10 cái.