Доброго времени суток! Вот интересует вопрос: как хранить на сервере изображения(например фотография пользователя размером 100кб. максимум) в очень большой количестве(5 миллионов). Вообще признаюсь, этот вопрос увидел на сайте одной фирмы, в качестве теста(причем и на стажера и на старшего php программиста вопросы одни и те же были))). Необходимо предложить свой алгоритм. Может быть есть статьи, если кто знает киньте пожалуйста ссылку. В Google искал не нашел, может не правильные запросы вводил. Да и сейчас работаю над одним проектом, разработкой доски объявлений, там тоже хотелось бы сделать как можно правильнее, чтобы не легла она, если зайдет больше 200 пользователей одновременно. Уже, а то 2 раза подобное слышал... Всем спасибо, за внимание и, возможно, за поделенный со всеми свой опыт
то есть ты боишься, что ФС будет тупить из-за большого кол-ва файлов? ну разбивай на папки. К примеру у тебя картинка получает имя от хеша - md5/sha1. Берешь 1-2 символа от имени файла, создаешь такую же папку и в нее картинку кладешь.
вопрос в типе ФС и количестве изображений в папке на этой ФС, когда не будут ощущаться тормоза ни для вытягивания картинки из папки, ни при определении нужной папки. Допустим у нас данные о картинке хранятся в БД. Запрос идёт напрямую к конкретному файлу, т.е. всяких тормозных листингов и создания списков не будет. В одной папке положим 1000 картинок, тогда для 5 млн картинок имеем 5000 папок. Можно, папки так же сложить по 500-1000 штук в отдельную. Таки имеем 5-10 внешних каталогов. Не так много, в принципе. Если кому не в лом - проверьте на практике
я бы не клал больше 50к файлов в одну папку, после моих тестов екст4, когда в папке 50 гигов и 1700 000 файлов, либо винт наелся либо фс все стоит раком, в дц все не могу выбраться, сгонять да посмотреть чо там)) но я бы не стал) разбивать в подпапки да и все
Встаёт 2 проблемы: * Проблема кол-ва файлов в папке. Я обычно делаю не более 10к папок/файлов на одном уровне. * Траффик. WEB сервер может не справится и не смочь отдавать такое кол-во трафика, тогда нужно ещё и разделять по WEB серверам всё.
не совсем. При предложенном мной разбиении папок будет немного (не более M = 16 * 16 ?). Зато в каждой папке будет по N / M картинок ото нефиг было кинопоиск/торрентсру парсить)
типа так - если generateHash() выдает строки из десятичных цифр, то емкость до миллиарда файлов, но не более 1000 в каждой папке: PHP: private function _targetName() { do { $this->rand9 = $this->generateHash(9); $ret = $this->buildString('{$uploadDir}{$rand9:0,3}/{$rand9:3,3}/{$rand9:6,3}.dat'); } while(file_exists($ret)); return $ret; }
я было подумал уж, что пхп умеет строчки вырезать как в баше ... незаметил ' .... жаль а то ты меня обнадежил )
пыха дура - ну ты в курсе. приходится делать за неё. это фрагмент из файл-менеджера, который пишу в данный момент. чтобы не разводить оффтопик, создам тему на пiха.ру (а то здесь всё строго, аж жуть)