"파일 시스템에 따라"
일부 사용자는 성능에 미치는 영향이 사용 된 파일 시스템에 달려 있다고 언급했습니다. 물론이야. EXT3와 같은 파일 시스템은 매우 느릴 수 있습니다. 그러나 EXT4 또는 XFS를 사용하더라도 FTP와 같은 외부 연결을 통해 ls
또는 find
외부 연결을 통해 폴더를 나열 하면 속도가 느려지는 것을 막을 수 없습니다 .
해결책
나는 @armandino 와 같은 방식을 선호합니다 . 이를 위해 PHP 에서이 작은 함수를 사용하여 ID를 디렉토리 당 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
-version에서 볼 수 있듯이 모든 폴더에는 최대 1000 개의 파일과 1000 개의 파일 및 99 개의 디렉토리를 포함하는 최대 99 개의 디렉토리가 있습니다 ...
그러나 많은 디렉토리에 동일한 성능 문제가 발생한다는 것을 잊지 마십시오!
마지막으로 총 파일 수를 줄이는 방법에 대해 생각해야합니다. 대상에 따라 CSS 스프라이트를 사용하여 아바타, 아이콘, 웃음 등과 같은 여러 개의 작은 이미지를 결합 할 수 있습니다. 또는 미디어 파일이 아닌 작은 파일을 많이 사용하는 경우 JSON 형식과 같은 조합을 고려하십시오. 내 경우에는 수천 개의 미니 캐시가 있었고 마침내 10 팩으로 묶기로 결정했습니다.