Temat: Organizacja pików użytkowników
Oprócz samej organizacji plików jest też sprawa związana z czasem dostępu do pliku, jeżeli w jednym katalogu jest zbytu dużo plików to czas dostępu zaczyna się wydłużać.
Wiadomo, że nie jest to problem we wszystkich systemach plików ale w niektórych tak.
Ja zrobiłem specjalny algorytm który na podstawie liczby całkowitej zwraca (i może stworzyć) katalog gdzie powinien się znaleźć plik.
Przy czym dla funkcji do której przekazujemy liczbę można określić ile maksymalnie może być w danym katalogu podkatalogów i plików.
Skąd wziąć liczbę ? Najczęściej plik jest powiązany z jakimś identyfikatorem liczbowym, a jeżeli nie to po prostu można zrobić np. crc32 na nazwie pliku.
/**
* Pobiera katalog w którym powinien być umieszczony
* plik o id 'fileId'.
*
* W każdym katalogu może być określona, maksymalna liczba plików,
* oraz określona, maksymalna liczba podkatalogów.
*
* Na podstawie 'fileId' są określane katalogi (o dowolnym zagłębieniu).
*
* Jeżeli maxFiles = 100 oraz maxDirs = 10, to plik o id 10001 będzie
* w katalogu (zostanie zwrócone): 0/9/
*
* @param int $fileId - indentyfikator liczbowy
* @param int $maxFiles - max liczba plikow w katalogu
* @param int $maxDirs - max liczba podkatalogow
* @param boolean $createDirs - czy sprawdzac/tworzyc katalogi ?
* @param string $path - sciezka poczatkowa, uzywana razem z $createDirs
*
* $path nie jest zwracane z funkcji.
*
* Funkcja zwraca katalog dla zasobu, moze byc pusty "" dla niskich liczb.
*/
static function getClusterFile($fileId, $maxFiles = 100, $maxDirs = 10,
$createDirs = false, $path = "")
{
$rt = "";
if ($createDirs)
{
if (!file_exists($path))
{
if (!mkdir($path, 0777)) return false;
@chmod($path, 0777);
}
}
if ( $fileId <= 0 || $fileId <= $maxFiles ) return "";
// Reszta z dzielenia fileId / maxFiles
$restId = $fileId%$maxFiles;
$formatedFileId = $fileId - $restId;
// Liczba katalogów jaka jest potrzebna do umieszczenia
// pliku
$howMuchDirs = $formatedFileId / $maxFiles;
while ($howMuchDirs > $maxDirs)
{
$r = $howMuchDirs%$maxDirs;
$howMuchDirs -= $r;
$howMuchDirs = $howMuchDirs/$maxDirs;
$rt .= $r . '/'; // DIRECTORY_SEPARATOR = / (zazwyczaj)
if ($createDirs)
{
$prt = $path.$rt;
if (!file_exists($prt))
{
mkdir($prt);
@chmod($prt, 0777);
}
}
}
$rt .= $howMuchDirs-1;
if ($createDirs)
{
$prt = $path.$rt;
if (!file_exists($prt))
{
mkdir($prt);
@chmod($prt, 0777);
}
}
$rt .= '/'; // DIRECTORY_SEPARATOR = / (zazwyczaj)
return $rt;
}
Enjoy - mile widziane jakieś ulepszenia algorytmu.