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

Форум PHP

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

 

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

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

тема: Изображения в базе данных и ресурсоемкость
 
 автор: Anwor   (15.07.2008 в 20:27)   письмо автору
 
 

Доброго времени суток.
Интересует вопрос следующего плана.... раньше для хранения двоичных данных всегда пользовался файловой системой сервера. Недавно решил супротив этого воспользоваться полем BLOB в мускуле, и этот подход мне очень понравился своей эргономичностью и принципом централизованного хранения данных.. (хотя это конечно дело вкуса).

И недавно с одним человеком подняли вопрос ресурсоемкости того и другого варианта. Воспользовавшись Апачевской утилитой "ab" этот чел сообщил, что вроде как вариант с централизованным хранением данных в мускуле зажирает ресурсов в 3 РАЗА БОЛЬШЕ.

Т.е. скажем берем код вида


<img src="images/<?=$row['id']?>.jpg">
<!-- где $row['id'] - результат фетча из базы -->


и сравниваем его с кодом


<img src="view.php?id=15">
<!-- где view.php просто залазит в базу и выдает на поток текст двоичного файла из BLOB-поля. -->


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

Прошу знающих людей помочь мне разобраться в этом вопросе. Подход хранения в BLOB'ах мне лично очень близок, но если мой оппонент в этом споре прав, то мне придется вернуться к плугу... (((

   
 
 автор: BinLaden   (15.07.2008 в 20:54)   письмо автору
 
   для: Anwor   (15.07.2008 в 20:27)
 

Первый вариант - запрос обыкновенного статического документа, на это требуется минимум процессорного времени и оперативной памяти, во втором уже требуется соединение с СУБД, запрос этой картинки, вывод. Причём, содержимое документа всё сразу забивается в оперативную память, а не по кусочкам.

Так что первый вариант предпочтительней.

   
 
 автор: Петр   (15.07.2008 в 21:35)   письмо автору
 
   для: BinLaden   (15.07.2008 в 20:54)
 

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

   
 
 автор: Anwor   (15.07.2008 в 21:39)   письмо автору
 
   для: Петр   (15.07.2008 в 21:35)
 

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

   
 
 автор: Anwor   (15.07.2008 в 21:35)   письмо автору
 
   для: BinLaden   (15.07.2008 в 20:54)
 

В принципе я понимаю разницу в процессах кроме одного момента.
При первом варианте чтобы отдать клиенту двоичный файл по HTTP разве сервер не прочитывает сперва текст этого двоичного файла в поток, а значит и в RAM, чтобы послать этот поток на клиент?

Щас попытаюсь объяснить, к чему я это..

Вариант №1:
1) клиент получает DOM-структуру документа и анализирует ссылку
2) по ссылке он подает запрос к файлу-фотке на сервере
3) апаче прочитывает его содержимое (в оп. память) и посылает клиенту


я правильно процесс описал? если верно, то содержимое двоичного файла так или иначе оказывается в RAM сервера.

Теперь Вариант №2:
1) клиент получает DOM-структуру документа и анализирует ссылку
2) по ссылке он подает запрос к скрипту-просмотрщику на сервере
3) тот открывает соединение с БД или использует уже открытое (кстати, не соображу возможен ли вариант с pconnect'ом)
4) скрипт достает текст фотки из базы и записывает его в RAM
5) апаче посылает его клиенту.


Если я все верно описал, то кроме ресурсозатрат на обращение к БД больше различий в потреблении оп. памяти быть не должно.... А если в чем-то скривил душой, то сильно не бейте =)

   
 
 автор: BinLaden   (16.07.2008 в 01:31)   письмо автору
 
   для: Anwor   (15.07.2008 в 21:35)
 

> HTTP разве сервер не прочитывает сперва текст этого двоичного файла в поток, а значит и в RAM

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

Грубо говоря, Вы видите разницу между

<?php
$fh 
fopen('big_file.txt''r');

while( ( 
$b fread($fh4098) ) !== false # Считывание 4 Kb текста
{
    echo 
$b# Отправка
}

fclose($fh);
?>


и

<?php
$buffer 
file_get_contents('big_file.txt'); # Запихивание всего содержимого в RAM

echo $buffer;
?>


? Можно считать, что буферизация вывода отключена.

   
 
 автор: Anwor   (16.07.2008 в 02:44)   письмо автору
 
   для: BinLaden   (16.07.2008 в 01:31)
 

Да, вполне наглядно....
Тогда вопрос, быть может возможно реализовать искусственную имитацию буферизации при считывании данных из LONGBLOB? Или на уровне мускула никак невозможно вмешаться в процесс, пока он заполняет переменную/массив данными?

П.С.: хочу еще вот что спросить: может ли как-то измениться ситуация, учитывая что на уровне РНР будет применяться GDlib? Дело в том что я пишу универсальный класс по закачке-считыванию изображений для CMS-ки. На клиентскую часть например к списку новостей будет прилагаться список соответствующих тамбнейлов. В прошлой версии своей CMS-ки я использовал просто 2 варианта файлов, т.е. через админку закачиваем здоровую картинку, скрипт ее ресайзит и создает уменьшенную копию, помещая соответственно ту и другую картинки в каталоги /thumbs/ и /photos/. Сейчас я хочу избавиться от этого геммороя, поместив оригинал картинки в BLOB, а на выходе - на лету через GD преобразовывать ее в тамбик нужных размеров, заданных в методе класса. В обслуживании такой метод будет более эргономичным. И вот тут внимание вопрос: скажется ли использование GD преобразований на том, используем мы файловую систему или базу данных? Или же оба процесса просто напросто удлинятся на величину GD-преобразований?
(пардон за такие адские умоизречения =)

   
 
 автор: sms-send   (16.07.2008 в 04:29)   письмо автору
 
   для: Anwor   (16.07.2008 в 02:44)
 

>закачиваем здоровую картинку, скрипт ее ресайзит и создает уменьшенную копию, помещая соответственно ту и другую картинки в каталоги /thumbs/ и /photos/. Сейчас я хочу избавиться от этого геммороя

Я бы назвал это не геммороем, а необходимой оптимизацией. Ресайзинг "здоровой катринки" "на лету" будет отнимать немало CPU и ОЗУ. Особенно, если пользователь просматривает что то вроде галлереи с уменьшенными копиями, браузер закидает сервер тормозящими запросами. Если онлайн-пользователей будет много, тормоза будут заметны + потенциально это может стать лазейкой для атаки DoS.

   
 
 автор: Anwor   (16.07.2008 в 19:44)   письмо автору
 
   для: sms-send   (16.07.2008 в 04:29)
 

Да.. это последняя капля ))) оставляю идею с BLOB-ами, отрываю буквально-таки от сердца )))
Тогда если не сложно, подскажите такую вещь: можно ли с помощью .хтаксесса искусственно изменить права на каталоги для закачиваемых файлов? Скажем в корне сайта есть каталог /img/, внутри него еще 2 - /thumbs/ и /photos/. Для верной работы нужно влезть на ФТП и всем им присвоить соотв. права на доступ, чтобы скрипт в админке потом смог поместить туда изображения. А если структура разветвится и например уйдет вглубь, то это превратится в настоящее наказание. Можно ли поместить в /img/ файл .htaccess с указанием прав доступа а-ля chmod для всех дочерних директорий, или же апаче тут вообще никак не сможет посодействовать?

   
Rambler's Top100
вверх

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