Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » upload картинок в базу данных

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3

Открыть новую тему     Написать ответ в эту тему

UncoNNecteD



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Дело не только в графике. Показывать не буду, но есть.
Уже на самом деле сотни тем были на тему хранения картинок в базе, и все они заканчивались одним - если картинки до 50 Кб, то проще хранить их в базе, если больше - то в файлах.
mysql нормально тягает блобы по 50-100 кб, не хуже файловой системы, а то что доступ к базе проще чем к файлам, думаю никто спорить не будет.

----------
-= Я тут чертовски давно =-

Всего записей: 4040 | Зарегистр. 21-03-2002 | Отправлено: 18:49 15-12-2004
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
mysql нормально тягает блобы по 50-100 кб
Вопрос-то не в том, тягает мускуль блобы или не тягает, а в том, что нет смысла хранить в базе данные, которые всего лишь являются хламом. К этим данным нельзя применить ни одну возможность SQL, кроме как вставить, удалить, изменить - все остальные операции с ними - бессмысленны. Опять же люди, кладущие картинки в базу, как правило абсолютно не заботятся о клиентском кэшировании. С файлами, лежащими в FS, его поддержка происходит автоматически.

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 19:55 15-12-2004 | Исправлено: SiMM, 19:57 15-12-2004
Swappp

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
UncoNNecteD

Цитата:
то что доступ к базе проще чем к файлам, думаю никто спорить не будет.

Я буду...

Код:
... //query etc...
echo '<img src="'.CONFIG_IMG_PATH.$s['img'].'>';

Все.
Теперь тоже с картинками БД:

Код:
... //query etc...
echo '<img src="'.CONFIG_IMG_SCRIPT."?id=$s[id]\">'

Но это еще не все, нужен файл имя которого содержится в константе CONFIG_IMG_SCRIPT.

Код:
... //query etc...
// header()... сейчас лень писать
echo $s['img'];

И где тут простота? Если бы файлы можно было напрямую вставлять в HTML, то да, согласен было бы проще, а так... Выполняем бесполезную работу.

Цитата:
mysql нормально тягает блобы по 50-100 кб

Если в таблице десяток строк, а если пара сотен?

Всего записей: 1716 | Зарегистр. 02-11-2001 | Отправлено: 20:43 15-12-2004 | Исправлено: Swappp, 20:44 15-12-2004
batva



crazy administrator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
UncoNNecteD

Цитата:
Дело не только в графике.

 
Да, нет, дело именно в графике.
Посмотри на сабж топика, и на все его сообщения, тут обсуждается именно графика.
 
 
Цитата:
Уже на самом деле сотни тем были на тему хранения картинок в базе, и все они заканчивались одним - если картинки до 50 Кб, то проще хранить их в базе, если больше - то в файлах.

 
Это где такую такую чушь от темы к теме пишут?
Тут я не помню ни одной такой.
 

Цитата:
mysql нормально тягает блобы по 50-100 кб, не хуже файловой системы, а то что доступ к базе проще чем к файлам, думаю никто спорить не будет.

 
Я уже писал тут, как эти картинки будут в html код вставляться?
Можешь привести пример?
 
 
Вот так
<img src="script.php?img=1">
 
И сравни с этим
<img src="img1.gif">
 
Что по твоему более эффективно?
 
Или апачу просто отдать статичный файл, который при этом будет кешироваться операционной системой, и отдаваться с кеша, а не читаться каждый раз с диска, или каждый раз будет компилиться скрипт, скрипт коннектится к базе данных, получает файл, отдает его в браузер.
А на странице у нас 20 картинок, это 20 запусков скрипта, 20 коннектов к базе, разница есть?
 
А что такое  Keep-Alive ты знаешь?
Наверно нет.
 
Советую почитать, чтобы понять как работает апачь, когда у него клиент запрашивает страницу с  кучей  графики на ней.
Там будет всего один апачев процесс.
Он тебе отдаст страницу и всю ее графику.
 
А в варианте с мускулом, на каждую html страницу будет запущено 20 процессов апача.(на каждую картинку один процесс).
Ну и плюс работа скрипта, коннекты к базе, об этом я выше писал..
 
 
Разницу в потребляемых ресурсах видно?
Каждый апачев процесс сколько кушает памяти, знаешь?
А сколько процессорного времени занимает один коннект к мускулу?
 
А теперь возьми листок и карандаш, и посчитай, какую посещаемость выдержит сервер в первом случае, и во втором.
Разница будет даже не на порядок, а много больше..
 
 
Ты говорил "хостеры советуют".
Никогда они такую чушь советовать не будут.
Я посмотрю на твоего хостера, когда он увидит, что для вывода одной статичной html паги требуются такие ресурсы от сервера...

Всего записей: 12593 | Зарегистр. 07-01-2001 | Отправлено: 02:33 16-12-2004
Mamay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
batva

Цитата:
Вот так
<img src="script.php?img=1">
 
И сравни с этим
<img src="img1.gif">  

с моей стороны это конечно придирки - но...
если я позволяю аплоад файлов то мне нужно удостоверится что добрая душа не зальёт какой-то скриптец с нехорошей функциональностью.
отсюда вытекают несколько мыслей
1. проверять расширение файла при аплоаде и недавать возможности залить *.PHP *.PL
2. хранить файлы в месте где к ним нет прямого доступа. (это автоматом подразумевает исспользование скрипта типа <img src="show_pic.php?name=1.gif"/>)
 
 
to All
Хранение файлов в БД есть бред вызванный недостатком:
а) алкоголя в крови
б) образования в голове
в) документации по языкам программирования
Г) молекул в ДНК
 
нужное подчеркнуть...

----------
Даже самый дурацкий замысел можно выполнить мастерски

Всего записей: 1352 | Зарегистр. 03-09-2002 | Отправлено: 13:49 16-12-2004
Daiz13



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
про ресурсоемкость полностью согласен, но все же позволю себе несколько робких возражений...
 

Цитата:
Или апачу просто отдать статичный файл, который при этом будет кешироваться операционной системой, и отдаваться с кеша, а не читаться каждый раз с диска

у меня все прекрасно кеширует, иногда даже несколько раз страницу перегружать  надо чтобы картинки обновились
 

Цитата:
Советую почитать, чтобы понять как работает апачь, когда у него клиент запрашивает страницу с  кучей  графики на ней.
Там будет всего один апачев процесс.
Он тебе отдаст страницу и всю ее графику.
 
А в варианте с мускулом, на каждую html страницу будет запущено 20 процессов апача.(на каждую картинку один процесс).

Не верю. Ткните меня мордой в мануал где написано что апач одним процесом отдает и саму страницу и графику. Какая ему разница что в img src написано. Тем более что  <img src="img1.gif">  вполне может быть скриптом.

Всего записей: 257 | Зарегистр. 06-06-2001 | Отправлено: 17:02 16-12-2004
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 17:46 16-12-2004
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Daiz13

Цитата:
Не верю. Ткните меня мордой в мануал где написано что апач одним процесом отдает и саму страницу и графику. Какая ему разница что в img src написано. Тем более что  <img src="img1.gif">  вполне может быть скриптом.

В мануал не ткну, но при большом количестве посещений картинки имеет смысл отдавать не просто статически, но и другим веб-сервером (что-нить images.site.com) Для примера смотрим на яндекс, там все картинки грузятся с хоста img.yandex.ru .
И на этом отдельном сервере не устанавливается на PHP, ни MYSQL и оптимизмруется он только под отдачу графики. Тем самым достигается разгрузка сервера приложений, который занимается своим делом, а не раздачей картинок, полученных из MySQL.
Поэтому советую еще раз перечитать последний пост batva и задуматься.

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 20:15 16-12-2004
Swappp

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mamay

Цитата:
2. хранить файлы в месте где к ним нет прямого доступа. (это автоматом подразумевает исспользование скрипта типа <img src="show_pic.php?name=1.gif"/>)  

А зачем мы их тогда загружали? для точного выяснения, что это именно картинка, а не txt, zip etc можно пересохранить ее с помощью GD...
dacuan

Цитата:
Для примера смотрим на яндекс, там все картинки грузятся с хоста img.yandex.ru

Зачем же так далеко, просто http://i.ru-board.com/s/smile.gif Или поскольку batva участник дискуссии это не считается?

Всего записей: 1716 | Зарегистр. 02-11-2001 | Отправлено: 20:50 16-12-2004 | Исправлено: Swappp, 20:54 16-12-2004
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Swappp

Цитата:
Зачем же так далеко, просто http://i.ru-board.com/s/smile.gif

А слона, то я и не заметил

Цитата:
Или поскольку batva участник дискуссии это не считается?

Я не в курсе, а при чем здесь batva?
Кстати о варианте

Цитата:
<img src="show_pic.php?name=1.gif"/>

На картинках > 1mb возникает презабавнейший глюк:
т.к. ограничение по памяти обычно 8M, то при одновременном запросе более 4-5 человек имеем ошибку
Цитата:
can't alloc
.

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 12:16 17-12-2004
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
т.к. ограничение по памяти обычно 8M, то при одновременном запросе более 4-5 человек имеем ошибку
При чём глюк, связанный исключительно с кривостью скрипта. Чтобы отдать файл пользователю - необязательно читать его весь в память целиком.
PS: слон кстати неправильный - пример с яндексом куда показательнее и нагляднее.

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 12:32 17-12-2004 | Исправлено: SiMM, 12:33 17-12-2004
UncoNNecteD



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Да, нет, дело именно в графике.  
Посмотри на сабж топика, и на все его сообщения, тут обсуждается именно графика.

Я сказал - НЕ ТОЛЬКО.
 

Цитата:
Это где такую такую чушь от темы к теме пишут?  
Тут я не помню ни одной такой.

Хочешь сказать это первый топик на эту тему? Юзай фильтр.

Цитата:
Вот так  
<img src="script.php?img=1">  
 
И сравни с этим  
<img src="img1.gif">

С ума сойти, трудность то какая... Не забывай, что мы говорим не о статических страницах, по большому счету. И твой, якобы более удобный вариант будет выглядеть скорее как:
<img srt="img<? echo $id; ?>.gif/jpeg/etc">  
Причем при разнотипных картинках ты будешь еще парится.  

Цитата:
Или апачу просто отдать статичный файл, который при этом будет кешироваться операционной системой, и отдаваться с кеша, а не читаться каждый раз с диска

Ну уморил... а mysql по твоему каждый раз читает с диска?

Цитата:
А на странице у нас 20 картинок, это 20 запусков скрипта, 20 коннектов к базе, разница есть?

Далее цитата из мануала по функции mysql_connect:

Цитата:
If a second call is made to mysql_connect() with the same arguments, no new link will be established, but instead, the link identifier of the already opened link will be returned.

Кто в танке - если уже есть линк к базе - второй открыватся не будет.

Цитата:
Там будет всего один апачев процесс.  
Он тебе отдаст страницу и всю ее графику.

Чушь. Что при первом, что при втором вариантах, к апачу будут сделаны столько запросов, сколько документов/графики и т.п. будет запрошено.  

Цитата:
Ты говорил "хостеры советуют".  
Никогда они такую чушь советовать не будут.

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

----------
-= Я тут чертовски давно =-

Всего записей: 4040 | Зарегистр. 21-03-2002 | Отправлено: 12:38 17-12-2004
dacuan

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SiMM

Цитата:
Чтобы отдать файл пользователю - необязательно читать его весь в память целиком.

Я бы сказал, зачем его читать вообще?
Да и при получении файла из мускля частями его читать не получится
 
UncoNNecteD

Цитата:
<img srt="img<? echo $id; ?>.gif/jpeg/etc">

 
У меня происходит именно так и не парюсь совершенно и строится урл примерно так:

Код:
 
<img srt="/img/<?=($id.'/'.$real_name)?>">
 


Цитата:
Ну уморил... а mysql по твоему каждый раз читает с диска?

А ты думаешь он все твои 5 тысяч картинок в оперативке держать будет? Или у него нет больше запросов кроме работы с картинками?
 

Цитата:
Далее цитата из мануала по функции mysql_connect:  
 
Цитата:
If a second call is made to mysql_connect() with the same arguments, no new link will be established, but instead, the link identifier of the already opened link will be returned.

 
Только действует это в проеделах одного скрипта, посмотри еще mysql_pconnect. Но даже не в подключении дело, а в том, что тебе банально не хватит оперативки на большие картинки (пример с яндексом не воодушевил?).
 

Цитата:
За всех ответишь?

А ссылочку хотя бы на одного?

Всего записей: 545 | Зарегистр. 23-10-2003 | Отправлено: 12:59 17-12-2004 | Исправлено: dacuan, 13:00 17-12-2004
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Да и при получении файла из мускля частями его читать не получится
Чета меня переклинило - приношу свои извинения за внесение этого бреда Почему-то подумал, что речь об отдаче файла с дисковой системы скриптом.
PS: из базы поле всё же можно забирать частями - но это конечно же изврат ещё тот

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 13:24 17-12-2004
Mamay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
UncoNNecteD

Цитата:
якобы более удобный вариант будет выглядеть скорее как:
<img srt="img<? echo $id; ?>.gif/jpeg/etc">  
Причем при разнотипных картинках ты будешь еще парится.

начнём стого что при нормальном расскладе у хостера установлен ImageMagic в котором есть convert с помощью которого при заливке картинки её можно конвертнуть куда угодно - лучше в gif или png если она не является таковой
что нам это даст - забудем о том что у картинок могут быть разные рассширения...
второе
есть ещё и ModeRevrite. с помощью которого можно линку выда <img src="/pictures/18.gif"> подменить на вызов скрипта show_pic.php?name=18.gif

----------
Даже самый дурацкий замысел можно выполнить мастерски

Всего записей: 1352 | Зарегистр. 03-09-2002 | Отправлено: 17:29 17-12-2004
batva



crazy administrator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
UncoNNecteD

Цитата:
а mysql по твоему каждый раз читает с диска?

 
Ну конечно он не читает каждый раз с диска.
Он прекрасно кеширует запросы.
Но соединение с базой все равно придется устанавливать, а это достаточно ресурсоемкий процесс.
Понимаешь?
Чтобы тебе взять картинку из кеша мускула, тебе надо с этим мускулом установить соединение.
И этих соединений будет столько, сколько картинок на странице.
Именно про 20 соединений я говорил, а не про 20 чтений с диска.
 

Цитата:
Далее цитата из мануала по функции mysql_connect:  
 
Цитата:If a second call is made to mysql_connect() with the same arguments, no new link will be established, but instead, the link identifier of the already opened link will be returned.  
 
Кто в танке - если уже есть линк к базе - второй открыватся не будет.  

 
Похоже, что в танке именно ты.
О чем мы можем с тобой спорить, если ты даже не понимаешь элементарных вещей.
 
Это когда в пределах одного процесса скрипта было установлено соединение, а ниже по коду будет попытка установить второе, с теми же параметрами, то оно не будет устанавливаться.
 
А тут будет 20 разных процессов скрипта, разных.
И для каждого процесса будет устанавливаться свое соединение с базой.
 
 
 

Цитата:
Чушь. Что при первом, что при втором вариантах, к апачу будут сделаны столько запросов, сколько документов/графики и т.п. будет запрошено.  

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

Цитата:
А что такое количество открытых файлов в системе слышал? Или только про кип-элайв ?  

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

Цитата:
С ума сойти, трудность то какая... Не забывай, что мы говорим не о статических страницах, по большому счету. И твой, якобы более удобный вариант будет выглядеть скорее как:  
<img srt="img<? echo $id; ?>.gif/jpeg/etc">  

 
Тяжелый случай.
 
Я с тобой больше не хочу спорить.
Зачем?
Это все равно, что биться о стенку головой.
Мир?
 
 
 
 
Для других же, кто хочет действительно что-то понять, а не просто слышать звон, попробую на пальцах описать еще раз.
 
 
Итак.
У нас есть страница, на которой 20 картинок.
 
Эта страница может быть статической, или генериться скриптом, не важно.
Пусть ее генерит скрипт index.php
 
Вводим в браузер http://blabla.com/index.php
 
Что происходит?
Запускается один апачев процесс , он запускает и выполняет php код. (Это если php установлен как модуль апача, если как CGI, то будет запущен внешний php интерпретатор.)
Результат работы скрипта index.php апачь отдает браузеру.
Браузер получил html код страницы, и начинает эту страницу отображать.
 
 
Дальше самое интересное.
Браузер в html коде встретил тег img
Вот такой
<img src=image.gif>
Что делает браузер?
Для получения этого файла браузер делает запрос к апачу.
Что делает апачь?
Апачь видит, что image.gif это статический файл.
Так как один апачев процесс уже был запущен для данного клиента (когда вызывался скрипт index.php), и он этот процесс еще живой (Keep-Alive таймаут обычно где то минимум 10 секунд), то для отдачи image.gif не будет запускаться другой процесс, и не будет устанавливаться другое TCP соединение.
И так все 20 картинок.
Все они будут отдаваться одним апачевым процессом.
 
 
А теперь возьмем случай, когда картинки хранятся в базе.
В html коде, который сгенерил index.php скрипт будут 20 строк вида
<img src=image.php?num=1>
<img src=image.php?num=2>
итд итп..
 
Для каждой картинки будет запущен отдельный апачев процесс, каждая копия скрипта image.php будет устанавливать отдельное соединение с базой.
 
Я уже писал, про ресурсоемкось установки соединения с базой.
Даже если картинку мускул отдаст из кеша, все равно соединение устанавливать придется.
 
Наверняка многие из вас при заходе на страницы сайтов часто встречали что-то типа  
"Error - Too many connections"  
Дело в том, что mysql имеет ограничение на кол-во одновременных соединений.
И если горе вебмастреру требуется 20 запусков скрипта, 20 соединений с базой, для вывода одной страницы, то бедный его хостер, который советует хранить картинки в базе..
 
Можете представить себе, что будет с сервером если этот сайт будет хоть сколько нибудь посещаемым.
 
 
Люди, что такое реляционные базы данных?
Почему там удобно и эффективно хранить данные?
 
Потому что можно легко, и быстро делать разнообразные выборки, сортировки, поиск, итд итп.. Верно?
 
 
Но картинки!
Вы же не сможете сделать что-то типа
SELECT все_картинки_у_которых_фон_белый.
 
 
Так зачем их тогда там хранить?
Кроме диких накладных расходов по производительности сервера, вы ничего от такого хранения не получите.
Никакого удобства нет.  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Всего записей: 12593 | Зарегистр. 07-01-2001 | Отправлено: 00:01 18-12-2004
Swappp

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
UncoNNecteD

Цитата:
Причем при разнотипных картинках ты будешь еще парится.

А кто запрещает хранить в БД имя файла с расширением? И про заголовки ты тихо умолчал... либо не знал ?
нам надо еще выдавать header("Content-type: image/png"); либо что то другое, так добавим еще одно поле в БД? Или будем каждый раз читать первые 4 байта?
batva

Цитата:
Браузер в html коде встретил тег img
Вот такой
<img src=image.gif>
Что делает браузер?
Для получения этого файла браузер делает запрос к апачу.
Что делает апачь?
Апачь видит, что image.gif это статический файл.
Так как один апачев процесс уже был запущен для данного клиента (когда вызывался скрипт index.php), и он этот процесс еще живой (Keep-Alive таймаут обычно где то минимум 10 секунд), то для отдачи image.gif не будет запускаться другой процесс, и не будет устанавливаться другое TCP соединение.
И так все 20 картинок.
Все они будут отдаваться одним апачевым процессом.  

Сейчас провел эксперимент:

Код:
<?PHP
if (empty($_GET['i']))
{
for ($i = 1; $i<=50;$i++)
{
echo "<img src=\"test.php?i=$i\">";
}
}
else
{
header("Content-type: image/png");
readfile('images/logo.png');
}
?>

Сниффером выяснил, что используется всего 2 TCP соединения (браузер разделяет), и поставив top на обновление каждые 0.1 сек не заметил порождения новых процессов (но заметил сильную загрузку двух существующих процессов). Так что здесь ты похоже ошибся. Либо это изменилось в apache 2 (я на нем тестировал).
Система Gentoo Linux, ядро 2.6.8.1, glibc с ntpl, apache 2.0.52, PHP-5.0.2

Всего записей: 1716 | Зарегистр. 02-11-2001 | Отправлено: 01:36 18-12-2004 | Исправлено: Swappp, 01:40 18-12-2004
batva



crazy administrator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Swappp
100% apache2 юзает Keep-Alive и для динамики.
 
Ок.
Ноу проблем пусть будет с Keep-Alive.
И все равно разница будет существенной.
 
Давай посмотрим.
 
Кстати, так как ты, не тестируют.
 
Во-первых через top ты ничего не увидишь, а во-вторых, нужно же нагрузить апачь, иначе он и не будет запускать новые процессы, одним уже запущенным все запросы по очереди отдаст.  
Запускать новый процесс он будет когда "под рукой" нет уже запущенного спящего. Понимаешь о чем я?
 
 
Отдаем картинку скриптом
test.php

Код:
 
<?PHP  
header("Content-type: image/gif");  
readfile('ru-board.gif');  
?>
 

 

Цитата:
 
[root@host1 bin]# ./ab -n 10000 -c 100 -k http://ru-board.com/test/test.php
This is ApacheBench, Version 1.3d <$Revision: 1.73 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/
 
Benchmarking ru-board.com (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Finished 10000 requests
Server Software:        Apache                                              
Server Hostname:        ru-board.com
Server Port:            80
 
Document Path:          /test/test.php
Document Length:        6731 bytes
 
Concurrency Level:      100
Time taken for tests:   12.723 seconds
Complete requests:      10000
Failed requests:        0
Broken pipe errors:     0
Keep-Alive requests:    9946
Total transferred:      69781168 bytes
HTML transferred:       67498468 bytes
Requests per second:    785.98 [#/sec] (mean)
Time per request:       127.23 [ms] (mean)
Time per request:       1.27 [ms] (mean, across all concurrent requests)
Transfer rate:          5484.65 [Kbytes/sec] received
 
Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0     0    0.2      0     4
Processing:     1    91  742.0     11 10830
Waiting:        0    91  742.0     10 10829
Total:          1    91  742.2     11 10831
 
Percentage of the requests served within a certain time (ms)
  50%     11
  66%     15
  75%     18
  80%     20
  90%     34
  95%     77
  98%    213
  99%   2615
 100%  10831 (last request)
 

 
 
А теперь без скрипта.
 
 

Цитата:
 
[root@host1 bin]# ./ab -n 10000 -c 100 -k http://ru-board.com/test/ru-board.gif
This is ApacheBench, Version 1.3d <$Revision: 1.73 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/
 
Benchmarking ru-board.com (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Finished 10000 requests
Server Software:        Apache                                              
Server Hostname:        ru-board.com
Server Port:            80
 
Document Path:          /test/ru-board.gif
Document Length:        6731 bytes
 
Concurrency Level:      100
Time taken for tests:   4.309 seconds
Complete requests:      10000
Failed requests:        0
Broken pipe errors:     0
Keep-Alive requests:    9918
Total transferred:      70379203 bytes
HTML transferred:       67370579 bytes
Requests per second:    2320.72 [#/sec] (mean)
Time per request:       43.09 [ms] (mean)
Time per request:       0.43 [ms] (mean, across all concurrent requests)
Transfer rate:          16333.07 [Kbytes/sec] received
 
Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0     0    0.2      0     4
Processing:     0    25  254.1      1  3974
Waiting:        0    25  254.1      1  3974
Total:          0    25  254.3      1  3974
 
Percentage of the requests served within a certain time (ms)
  50%      1
  66%      2
  75%      3
  80%      3
  90%      4
  95%      4
  98%     28
  99%    246
 100%   3974 (last request)
[root@host1 bin]#  
 

 
Перед каждым тестом апачь перезапускался. (чтобы убить существующие процессы.)
 
 
А вот данные по загрузке процессора, и кол-во процессов по окончании теста.
 
Это картинка скриптом.
 

Цитата:
 
Apache Server Status for 65.75.176.221
Server Version: Apache  
Server Built: Jul 1 2004 08:49:07  
 
--------------------------------------------------------------------------------
 
Current Time: Friday, 17-Dec-2004 20:28:45 PST  
Restart Time: Friday, 17-Dec-2004 20:28:24 PST  
Parent Server Generation: 0  
Server uptime: 21 seconds  
Total accesses: 10145 - Total Traffic: 65.0 MB  
CPU Usage: u6.57 s2.47 cu0 cs0 - 43% CPU load  
483 requests/sec - 3.1 MB/second - 6.6 kB/request  
4 requests currently being processed, 58 idle workers
KK_____.______W_______C____.____________________________________
................................................................
................................................................
................................................................
 
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process
 
Srv PID Acc M CPU  SS Req Conn Child Slot Client VHost Request  
0-0 5236 9/9/9 K  0.00 5 0 0.0 0.00 0.00  85.91.100.103 smilies.ru-board.com GET /sm/smilie_bett.gif HTTP/1.1  
1-0 5242 8/8/8 K  0.01 5 0 0.0 0.00 0.00  85.91.100.103 smilies.ru-board.com GET /sm/mconfused.gif HTTP/1.1  
2-0 5243 0/1082/1082 _  1.01 4 0 0.0 6.95 6.95  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
3-0 5244 0/1209/1209 _  0.93 4 0 0.0 7.76 7.76  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
4-0 5245 0/674/674 _  0.59 4 0 0.0 4.33 4.33  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
5-0 5246 0/671/671 _  0.58 4 0 0.0 4.31 4.31  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
6-0 5247 0/632/632 _  0.57 4 0 0.0 4.06 4.06  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
7-0 - 0/0/632 .  0.54 2 0 0.0 0.00 4.06  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
8-0 5249 0/476/476 _  0.42 4 0 0.0 3.06 3.06  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
9-0 5250 0/486/486 _  0.39 4 0 0.0 3.12 3.12  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
10-0 5251 0/339/339 _  0.39 4 0 0.0 2.18 2.18  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
11-0 5252 0/377/377 _  0.37 4 0 0.0 2.42 2.42  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
12-0 5253 0/463/463 _  0.35 4 0 0.0 2.97 2.97  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
13-0 5254 0/337/337 _  0.34 4 0 0.0 2.16 2.16  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
14-0 5255 0/377/377 W  0.32 0 0 0.0 2.42 2.42  85.64.128.20 ru-board.com GET /server-status HTTP/1.1  
15-0 5256 0/273/273 _  0.30 4 0 0.0 1.75 1.75  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
16-0 5257 0/244/244 _  0.25 4 0 0.0 1.57 1.57  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
17-0 5258 0/235/235 _  0.24 4 0 0.0 1.51 1.51  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
18-0 5259 0/288/288 _  0.20 4 0 0.0 1.85 1.85  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
19-0 5260 0/227/227 _  0.18 4 0 0.0 1.46 1.46  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
20-0 5261 0/152/152 _  0.19 4 0 0.0 0.98 0.98  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
21-0 5262 0/156/156 _  0.18 4 0 0.0 1.00 1.00  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
22-0 5263 0/201/201 C  0.11 0 0 0.0 1.29 1.29  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
23-0 5264 0/176/176 _  0.12 4 0 0.0 1.13 1.13  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
24-0 5265 0/80/80 _  0.14 4 0 0.0 0.51 0.51  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
25-0 5266 0/74/74 _  0.09 4 0 0.0 0.48 0.48  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
26-0 5267 0/74/74 _  0.07 4 0 0.0 0.48 0.48  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
27-0 - 0/0/95 .  0.05 0 0 0.0 0.00 0.61  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
28-0 5269 0/32/32 _  0.03 4 0 0.0 0.21 0.21  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
29-0 5270 0/39/39 _  0.03 4 0 0.0 0.25 0.25  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
30-0 5271 0/16/16 _  0.03 4 0 0.0 0.10 0.10  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
31-0 5275 0/10/10 _  0.01 4 0 0.0 0.06 0.06  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
32-0 5279 0/1/1 _  0.01 4 0 0.0 0.01 0.01  65.75.176.221 ru-board.com GET /test/test.php HTTP/1.0  
 
 
 
--------------------------------------------------------------------------------
Srv Child Server number - generation  
PID OS process ID  
Acc Number of accesses this connection / this child / this slot  
M Mode of operation  
CPU CPU usage, number of seconds  
SS Seconds since beginning of most recent request  
Req Milliseconds required to process most recent request  
Conn Kilobytes transferred this connection  
Child Megabytes transferred this child  
Slot Total megabytes transferred this slot  
 
--------------------------------------------------------------------------------
 
Apache Server at 65.75.176.221 Port 80
 

 
А это без
 

Цитата:
 
Apache Server Status for 65.75.176.220
Server Version: Apache  
Server Built: Jul 1 2004 08:49:07  
 
--------------------------------------------------------------------------------
 
Current Time: Friday, 17-Dec-2004 20:29:58 PST  
Restart Time: Friday, 17-Dec-2004 20:29:37 PST  
Parent Server Generation: 0  
Server uptime: 21 seconds  
Total accesses: 10111 - Total Traffic: 64.9 MB  
CPU Usage: u1.31 s1.38 cu0 cs0 - 12.8% CPU load  
481 requests/sec - 3.1 MB/second - 6.6 kB/request  
2 requests currently being processed, 15 idle workers  
_K_________W_____...............................................
................................................................
................................................................
................................................................
 
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process
 
Srv PID Acc M CPU  SS Req Conn Child Slot Client VHost Request  
0-0 5352 0/1/1 _  0.00 1 0 0.0 0.00 0.00  85.64.128.20 ru-host.com GET /server-status HTTP/1.1  
1-0 5359 1/1/1 K  0.00 8 0 0.0 0.00 0.00  24.188.12.225 dimon.org.ua GET /forum/uploads/av-604.jpg HTTP/1.1  
2-0 5363 0/3315/3315 _  0.96 4 0 0.0 21.28 21.28  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
3-0 5365 0/1582/1582 _  0.39 4 0 0.0 10.16 10.16  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
4-0 5366 0/1424/1424 _  0.36 4 0 0.0 9.14 9.14  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
5-0 5368 0/766/766 _  0.15 4 0 0.0 4.92 4.92  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
6-0 5369 0/770/770 _  0.18 4 0 0.0 4.94 4.94  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
7-0 5370 0/550/550 _  0.16 4 0 0.0 3.53 3.53  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
8-0 5371 0/487/487 _  0.16 4 0 0.0 3.13 3.13  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
9-0 5373 0/247/247 _  0.08 4 0 0.0 1.59 1.59  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
10-0 5374 0/198/198 _  0.08 4 0 0.0 1.27 1.27  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
11-0 5375 0/270/270 W  0.03 0 0 0.0 1.73 1.73  85.64.128.20 ru-host.com GET /server-status HTTP/1.1  
12-0 5376 0/185/185 _  0.07 4 0 0.0 1.19 1.19  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
13-0 5377 0/132/132 _  0.02 4 0 0.0 0.85 0.85  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
14-0 5378 0/106/106 _  0.03 4 0 0.0 0.68 0.68  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
15-0 5379 0/48/48 _  0.00 4 0 0.0 0.31 0.31  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
16-0 5380 0/29/29 _  0.02 4 0 0.0 0.19 0.19  65.75.176.221 ru-board.com GET /test/ru-board.gif HTTP/1.0  
 
 
 
--------------------------------------------------------------------------------
Srv Child Server number - generation  
PID OS process ID  
Acc Number of accesses this connection / this child / this slot  
M Mode of operation  
CPU CPU usage, number of seconds  
SS Seconds since beginning of most recent request  
Req Milliseconds required to process most recent request  
Conn Kilobytes transferred this connection  
Child Megabytes transferred this child  
Slot Total megabytes transferred this slot  
 
--------------------------------------------------------------------------------
 
Apache Server at 65.75.176.220 Port 80
 

 
 
Пару затесавшихся лишних запросов на smilies.ru-board.com  не берем.
На результат они не влияют, просто не хотелось выключать сайт.
 
Разницу видно?
 
Думаю да.
 
Про память я вообще молчу.
Все знают сколько кушает один апачев процесс?
Особенно apache2
 
Посмотреть можно через ps
 
С выключенным Keep-Alive ситуация еще хуже.
 
Тесты показывать не буду, смысл там такой же.
 
php скрипт из двух строк, а если там еще коннект к mysql будет?  
Тесты показывать?
 
Не буду.
Кому нужно сделайте их сами, убедитесь раз и навсегда, что такое хранение картинок в mysql.
 
 
 
 
 
 
 
 
 
 
 
Добавлено
В ПМ была просьба показать тест с мускулом.
 
 
Показываю.
 
test2.php

Код:
 
<?php
$link = mysql_connect('localhost', 'ru-board', '***');
mysql_select_db('test');
$query = 'SELECT * FROM test WHERE id =1';
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);
header("Content-type: image/gif");  
echo $row['image'];
?>  
 

 

Цитата:
 
CREATE TABLE `test` (
  `id` int(11) NOT NULL auto_increment,
  `image` blob NOT NULL,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM
 

 
В таблицу была положена одна картинка.
Та же самая, что и в предыдущих тестах.
 
В MySQL кеширование включено.
Размер кеша-достаточный.
max_connections=200
 
 

Цитата:
 
[root@host1 bin]# ./ab -n 10000 -c 100 -k http://ru-board.com/test/test2.php
This is ApacheBench, Version 1.3d <$Revision: 1.73 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/
 
Benchmarking ru-board.com (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Finished 10000 requests
Server Software:        Apache                                              
Server Hostname:        ru-board.com
Server Port:            80
 
Document Path:          /test/test2.php
Document Length:        6733 bytes
 
Concurrency Level:      100
Time taken for tests:   19.655 seconds
Complete requests:      10000
Failed requests:        6287
   (Connect: 0, Length: 6287, Exceptions: 0)
Broken pipe errors:     0
Keep-Alive requests:    9940
Total transferred:      36224667 bytes
HTML transferred:       33833756 bytes
Requests per second:    508.78 [#/sec] (mean)
Time per request:       196.55 [ms] (mean)
Time per request:       1.97 [ms] (mean, across all concurrent requests)
Transfer rate:          1843.03 [Kbytes/sec] received
 
Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0     0    4.1      0    98
Processing:     1   169  894.7     17 12518
Waiting:        0   168  894.8     16 12518
Total:          1   170  897.4     17 12518
 
Percentage of the requests served within a certain time (ms)
  50%     17
  66%     32
  75%     39
  80%     44
  90%    121
  95%    375
  98%   1402
  99%   6332
 100%  12518 (last request)
[root@host1 bin]# ./ab -n 10000 -c 100 -k http://ru-board.com/test/test2.php
This is ApacheBench, Version 1.3d <$Revision: 1.73 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/
 
Benchmarking ru-board.com (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Finished 10000 requests
Server Software:        Apache                                              
Server Hostname:        ru-board.com
Server Port:            80
 
Document Path:          /test/test2.php
Document Length:        6733 bytes
 
Concurrency Level:      100
Time taken for tests:   18.076 seconds
Complete requests:      10000
Failed requests:        3113
   (Connect: 0, Length: 3113, Exceptions: 0)
Broken pipe errors:     0
Keep-Alive requests:    9969
Total transferred:      53110105 bytes
HTML transferred:       50774468 bytes
Requests per second:    553.22 [#/sec] (mean)
Time per request:       180.76 [ms] (mean)
Time per request:       1.81 [ms] (mean, across all concurrent requests)
Transfer rate:          2938.16 [Kbytes/sec] received
 
Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0     1    6.0      0   239
Processing:     1   179  625.1    102  9084
Waiting:        0   178  625.1    101  9084
Total:          1   180  627.8    102  9084
 
Percentage of the requests served within a certain time (ms)
  50%    102
  66%    122
  75%    159
  80%    183
  90%    237
  95%    292
  98%    511
  99%   4055
 100%   9084 (last request)
[root@host1 bin]#  
 

 
Второй тест это с использованием  persistent коннектов mysql_pconnect()
Кол-во Failed requests заметно ниже.
Но все равно.. недопустимо..
 
 
Запрет кеширования в MySQL на результат не повлиял.
Показатели в общем то остались прежними, изменения мизерны.
 
Но оно и понятно, SQL запрос для мускула слишком простой, тем более что и таблица там супер просто, два поля и одна строка.  
Без разницы с кеша брать или нет.
 
В реальности с большой таблицей результаты будут конечно хуже.  
 
 
P.S
Во время теста, mysql кроме соб-но теста занималась еще кое чем .
Выключать сайт ради чистоты тестов я не стал.
Я ни коем образом не претендую ни на что.
 
Кого не устраивает что-то, проводите свои тесты.
 
 
 
 
 
 
 
 
 
 
 

Всего записей: 12593 | Зарегистр. 07-01-2001 | Отправлено: 08:04 18-12-2004
Sergeant

Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Так, а если речь идет не о хранении картинок как таковых, а только записей о них.. Т.е. в базе хранятся к примеру: имя файла, его тип, габариты, размер (чтоб по сто раз getimagesize() не вызывать), описание. Вызываются картинки указанным выше способом:
Код:
<img src='image.php?id=123'>
В скрипте - само собой, коннект к базе и вывод файла.
 
Что скажете о таком способе работы с картинками? Я просто не знаю, каким образом еще можно вести репозиторий имеющихся картинок. Но про использование BLOB для подобного полностью согласен - негоже файлы в базы пихать, если на то существует файловая система.

----------
Если вы спорите с идиотом,
Наверняка, он занимается тем же самым.

Всего записей: 1553 | Зарегистр. 06-08-2001 | Отправлено: 11:13 18-12-2004
batva



crazy administrator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sergeant

Цитата:
Т.е. в базе хранятся к примеру: имя файла, его тип, габариты, размер (чтоб по сто раз getimagesize() не вызывать), описание. Вызываются картинки указанным выше способом:
Код:<img src='image.php?id=123'>  

 
Ну и зачем они будут так вызываться?
В базе держи имя, тип, размер итд итп но выводи на страницу как обычно
<img src=image/file.gif>
 
Твой скрипт, который генерит страницу на которой картинки, он ведь "уже знает", какие там будут картинки? Ну так и выводи сразу, зачем тот промежуточный скрипт нужен?
 
А иначе если не знает, как он эти параметры (?id=123) прописывать будет?
 
 
 
 
 
Добавлено
То есть другими словами все манипуляции сделай в основном скрипте.
Выбери сразу имена 20 картинок одним селектом, и все.
 
Ну допустим галерея, на каждой странице 20 фоток.
 
Нужно отдать пятую страницу, автор Вася.
 
 
SELECT name_fle, dir FROM images WHERE author='vasya' AND type='jpg' LIMIT 80,20
Ну и далее в цикле
 
<img src=$dir/$name_fle.jpg>

Всего записей: 12593 | Зарегистр. 07-01-2001 | Отправлено: 11:30 18-12-2004
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3

Компьютерный форум Ru.Board » Интернет » Web-программирование » upload картинок в базу данных


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru