Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Организация хранения файлов на сайте
 
 автор: Udachix   (09.05.2013 в 09:38)   письмо автору
 
 

Доброе утро. Всех с Днём Победы!

Подскажите, как лучше всего организовать хранение данных на сайте?

Для примера возьмём фотоальбомы. Очень подходит. Имеются фотоальбомы. В каждом загружаются фотографии. Фотоальбомы могут ссылаться друг на друга (то есть имеется возможность вкладывать один в другой). Если создавать папку в /photos/ для каждого фотоальбома по ID (например, /photos/5/), то все фотографии будут загружены в эту папку. Если фотографий будет 100 000, а для каждой создаётся в папке по четыре файла (preview), то всего получим в папке уже целых 400 000 файлов. То есть при удалении фотоальбома нужно будет удалить 400 000 файлов, и только потом папку. Это может слишком нагрузить сервер. Не так ли? Как поступить, кто сталкивался, у кого есть идеи? Спасибо.

  Ответить  
 
 автор: cheops   (09.05.2013 в 09:48)   письмо автору
 
   для: Udachix   (09.05.2013 в 09:38)
 

У вас и директория с таким объемом файлов будет читаться не быстро. Обычно каждой фотографии назначается хэш, а на диске заводятся директории с таким хэшем, в результате фотографии хранятся ни в одной директории, а в сотнях.
При удалении такого объема не удаляйте фотографии, а помечайте как удаленные, которые удаляйте постепенно в фоновом режиме, например, по cron-заданию.

  Ответить  
 
 автор: Udachix   (10.05.2013 в 01:56)   письмо автору
 
   для: cheops   (09.05.2013 в 09:48)
 

Да да, кстати, о cron'е я уже думал и как раз хотел просто переименовывать папки, прибавляя "deleted_" или что-то вроде того. Однако, остаётся вопрос, какие папки мне переименовывать? То есть как всё же хранить эти файлы?

P. S. Каждое фото прописано в DB, поэтому мне не нужно читать директорию саму. Я просто знаю, что файл там есть.

  Ответить  
 
 автор: cheops   (10.05.2013 в 09:40)   письмо автору
 
   для: Udachix   (10.05.2013 в 01:56)
 

>прибавляя "deleted_" или что-то вроде того.
Лучше правами доступа манипулируйте, например убирайте read. Те файлы, у которых отсутствует права доступа read, скажем на группу или для всех остальных - подлежат уничтожению.

>Однако, остаётся вопрос, какие папки мне переименовывать? То есть как всё же хранить эти файлы?
Папки вообще лучше не трогать. Обычно вычисляют crc32-хэш имени файла (нужно обеспечить их уникальность) и берут первые 2-3 символа от хэша - это и есть имя папки, файлы у вас равномерно распределяются по 100-1000 папкам. В результате в каждую папку в отдельности легко получить доступ, а по имени файла легко вычислить название папки, где его следует искать.

  Ответить  
 
 автор: Udachix   (10.05.2013 в 15:37)   письмо автору
 
   для: cheops   (10.05.2013 в 09:40)
 

Кажется, идею понял. Но всё равно есть вопрос.

Имена файлов сейчас у меня следующие (примеры):
photo5_iCuZD08fUm1QAM.jpg
photo25_fbuowau6oNOwG3.jpg
photo100_gEVZqHqUqFvL6u.jpg
photo250_wyAAEBdFmAwCef.jpg
photo500_UQtVBQLStv6aB3.jpg
photo711_vyjrhUDXCOmGzu.jpg
photo10700_5nv3RLXCI0SdMj.jpg
Как это мне поможет в распределении "по 100-1000 папкам"?

  Ответить  
 
 автор: Udachix   (10.05.2013 в 02:00)   письмо автору
 
   для: cheops   (09.05.2013 в 09:48)
 

Была ещё идея такая:
/photos/100000/5/photo.jpg
/photos/200000/100005/photo.jpg
/photos/300000/200005/photo.jpg
/photos/400000/300005/photo.jpg
, то есть разделять по сотням тысяч ID.

Осталось только в PHP найти функцию, способную округлить число до 100 000 ) Например, 1 125 350 до 1 200 000.

  Ответить  
 
 автор: cheops   (10.05.2013 в 09:42)   письмо автору
 
   для: Udachix   (10.05.2013 в 02:00)
 

Лучше используйте хэши - они экономичнее и более масштабируемы. Более того, они специально для таких задач созданы.

  Ответить  
 
 автор: Udachix   (10.05.2013 в 17:36)   письмо автору
 
   для: cheops   (10.05.2013 в 09:42)
 

Всё, разобрался и реализовал, почти.

Теперь изображения сохраняются как:
photos\ed\23\91\e4\ed2391e4d104259fd8a46793c91e7f27.jpg

Одно но, теперь удалять сложнее. Вдруг, будет существовать два изображения с адресами:
photos\ed\23\91\e4\ed2391e4d104259fd8a46793c91e7f27.jpg
photos\ed\23\91\4e\ed23914ed104259fd8a46793c91e7f27.jpg
Удаляя первое под корень папки, я удалю второе, а если удалять только сами файлы — директории останутся пустыми, тоже как-то не то...

  Ответить  
 
 автор: Владимир55   (10.05.2013 в 17:52)   письмо автору
 
   для: Udachix   (10.05.2013 в 17:36)
 

если удалять только сами файлы — директории останутся пустыми

Во многих ЦМС именно так и происходит. При этом образуются десятки и даже сотни тысяч пустых директорий.

Более того,
Даже если заносится товар, не имеющий изображения, директория создается и для этого товара (заведомо пустая).

  Ответить  
 
 автор: Udachix   (10.05.2013 в 18:10)   письмо автору
 
   для: Владимир55   (10.05.2013 в 17:52)
 

Вы так сказали, будто это болезнь системы и её не вылечить )

Cron по пустым запускать?

  Ответить  
 
 автор: cheops   (10.05.2013 в 18:30)   письмо автору
 
   для: Udachix   (10.05.2013 в 18:10)
 

Да пусть остаются - на самом деле это даже хорошо, потом не нужно тратить время на их создание. Главное, чтобы в одной директории было не много файлов и других директорий - тогда поиск по такой иерархии будет осуществляться быстро.

  Ответить  
 
 автор: Udachix   (10.05.2013 в 20:18)   письмо автору
 
   для: cheops   (10.05.2013 в 18:30)
 

Сделал четыре уровня, в конце каждого по три варианта одного файла. Надеюсь, не много будет.

  Ответить  
 
 автор: Владимир55   (10.05.2013 в 19:08)   письмо автору
 
   для: Udachix   (10.05.2013 в 18:10)
 

Не то, что бы болезнь, а такова реальность, и разработчики идут на это.

Реальное неудобство возникает лишь в том случае, когда хостер ограничивает количество файлов на хостинге (обычно 130 тысяч), поскольку пустые директории считаются как и файлы.

Кстати, даже чере ФТП удаляются они жутко долго.

  Ответить  
 
 автор: cheops   (10.05.2013 в 19:10)   письмо автору
 
   для: Владимир55   (10.05.2013 в 19:08)
 

Через FTP вообще все делается очень долго (так как на каждую операцию нужно дождаться ответа), такие структуры лучше всего удалять через SSH при помощи команды rm -rf (только от путь от греха лучше задавать абсолютный).

  Ответить  
 
 автор: Udachix   (10.05.2013 в 20:17)   письмо автору
 
   для: cheops   (10.05.2013 в 19:10)
 

Я тут на днях буквально испугался сильно очень. Написал функцию по циклическому удалению директорий через rmdir. Чуть не охренел, простите, что путь указал "/". Оказалось всё хорошо, путь был "./", так что он ничего не удалил )

  Ответить  
 
 автор: Владимир55   (11.05.2013 в 10:50)   письмо автору
 
   для: cheops   (10.05.2013 в 19:10)
 

Я вот тут припомнил такой факт: когда-то я делал сайт с очень большим количеством статических страниц и разместил их в директориях по 15 тысяч страниц в каждой. Субьективно замедления открытия страниц не было заметно (по отношению к тем, что в корне).

  Ответить  
 
 автор: cheops   (11.05.2013 в 11:17)   письмо автору
 
   для: Владимир55   (11.05.2013 в 10:50)
 

Замедление можно заменить, как правило, только при первом открытии директории или если на сервере мало свободной памяти и содержимое директории не кэшируется. Кроме этого замедление может быть при обслуживании такой директории по FTP, когда после каждой операции получается список содержимого текущей директории (он может быть не маленьким).

  Ответить  
 
 автор: Udachix   (12.05.2013 в 11:58)   письмо автору
 
   для: Udachix   (09.05.2013 в 09:38)
 

Всем спасибо. Ваши примеры, мнения и взгляды очень помогли. Я реализовал, что хотел. Всё получилось.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования