[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблемы с "переполнением" ФС ext3
kirik
Привет!

Я с такой проблемкой: файловая система ext3 может вместить только 32 000 папок в одной папке. При создании ресурса я не знал об этом ограничении (точнее подозревал, но почему-то всю дорогу думал что 32к - это ограничение по глубине директорий) и делал как будет удобнее:
Цитата
/news/
--/12/ (id новости)
----picture_1.jpg
----другие файлы...
--/23/ (id новости)
----picture_3.jpg
----другие файлы...


И теперь возникла проблемко.. Новостей > 32 000, файловая система на вызов функции mkdir() выдает
Цитата
mkdir() [function.mkdir]: Too many links


Собственно вопрос - как будет грамотнее это ограничение обойти? Поделитесь пожалуйста опытом.. А то я боюсь долго буду думать.

Спасибо!



Спустя 2 часа, 29 минут, 33 секунды (13.06.2009 - 23:26) kirik написал(а):
На данный момент есть 2 идеи:
1. Конвертнуть ФС в xfs
2. Переделывать структуру каталогов (ну эт в любом случае) примерно таким способом:

Имеем ID новости. Берем md5 сумму этого ID-шника, из первых двух символов этой суммы создаем папки, и в последней папке создаем еще одну папку с ID этой новости. Пример:
ID новости 453, md5 - 49ae49a23f67c759bf4fc791ba842aa2; создаем путь /news/4/9/453/ - это будет новая папка этой новости. Итого: каждый уровень каталогов будет иметь 16 папок, а в последнем будет иметь около 125 папок при общем количестве новостей в 32 000.
Как оказалось сессии в php используют именно такой способ хранения. Пожалуй на нем и остановимся smile.gif

Спустя 35 минут, 5 секунд (14.06.2009 - 00:01) Alchemist написал(а):
только не подеритесь, горячие финские парни smile.gif

Спустя 37 минут, 28 секунд (14.06.2009 - 00:38) kirik написал(а):
Цитата (Alchemist @ 13.06.2009 - 16:01)
только не подеритесь, горячие финские парни

biggrin.gif biggrin.gif Будем стараться smile.gif


Спустя 14 минут, 44 секунды (14.06.2009 - 00:53) kirik написал(а):
Итак, для подобных нужд родился класс с громким названием FSDriver smile.gif

PHP
class FSDriver {
    private $salt = 'some_salt_text';
    private $levels = 2;

    public function mkdir($src_path, $mode=0777)
    {
        list($path, $fldr, $hash) = $this->gv($src_path);

        if(!file_exists($path) && !mkdir($path))
            return false;

        for($i = 0; $i < $this->levels; $i++)
        {
            $path .= $hash{$i}.'/';
            if(!file_exists($path) && !mkdir($path, $mode))
                return false;
            chmod($path, $mode);
        }

        if(!file_exists($path.$fldr) && !mkdir($path.$fldr, $mode))
            return false;

        chmod($path.$fldr, $mode);

        return true;
    }

    public function gtdir($src_path, $create=false, $mode=0777)
    {
        list($path, $fldr, $hash) = $this->gv($src_path);

        for($i = 0; $i < $this->levels; $i++)
        {
            $path .= $hash{$i}.'/';
        }

        if(($create && !file_exists($path.$fldr) && $this->mkdir($src_path, $mode)) || !$create)
            return $path.$fldr;
        else
            return false
;
    }

    private function gv($path)
    {
        $path = rtrim($path, '/');
        $last = strrpos($path, '/') + 1;
        $fldr = substr($path, $last);
        $path = substr($path, 0, $last);
        $hash = md5($fldr.$this->salt);

        return array($path, $fldr, $hash);
    }
}


Комменты писать не люблю, поэтому немного опишу работу:
$salt - "соль", для большей секурности (а то кто-нить захочет разобраться "а как это у них файлы хранятся?")
$levels - количество папок в "глубь".
Эти значения можно менять только при первоначальной установке.


Использование:
PHP
$path = '/home/user/news/2435534'; // "человекопонятный" путь до будущей папки (может быть со слэшем на конце или без)

$fsd = new FSDriver;

$fsd->mkdir($path, 0700); // создаем папку (возвращает false если че не так) [дефолтные права - 0777]
echo $fsd->gtdir($path); // так можно преобразовать человекопонятный путь в "хэшированный" без создания папки

// а так можно не только преобразовать человекопонятный путь в "хэшированный"
// но и паралельно создать папку (если все ОК, возвращает путь новой папки, иначе - false)  [дефолтные права - 0777]
echo $fsd->gtdir($path, true, 0700);


Папочный разделитель "/", для тестов под виндами правьте сами, а для работы под виндами этот класс и не особо нужен (ограничение такое у NTFS отсутствует). Для работы с русскими путями нужно заменить обычные строковые функции на мультибайтовые.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.