Хранение изображений в БД

Discussion in 'PHP' started by Doom123, 1 Oct 2009.

  1. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    Вот не могу никак решить где лучше хранить фотографии .. в БД или в файлах ..

    краткое описание ... Сайт с анкетами на куждую анкету по 8 фоток ... примерная посещяемость 5к в день ..


    как вы считаете где их лучше хранить?
     
  2. ChieFSS

    ChieFSS Elder - Старейшина

    Joined:
    23 Nov 2006
    Messages:
    35
    Likes Received:
    2
    Reputations:
    0
    Файлами и только файлами. В БД достаточно хранить пути к файлам.
    Работа с БД занимает 80% процессорной мощности от выделенной под сайт.
    Как минимум лишняя нагрузка на сервер.
     
    #2 ChieFSS, 1 Oct 2009
    Last edited: 1 Oct 2009
  3. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    ну смотри на скоко я знаю запрос вида

    SELECT `last_update` FROM `time` WHERE name = "update"

    работает не намного медленее

    file_get_contents('last_update.txt');
     
  4. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,548
    Likes Received:
    1,397
    Reputations:
    612
    ну вообще то медленее, тк file_get_contents в случае с файлами вообще не нужен.
     
    1 person likes this.
  5. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    PHP:
    <?php


    mysql_connect
    ('localhost','root','') or die('a');
    mysql_select_db('a') or die('a');

    $i 0;

    $time microtime(1);

    while(
    $i 20)
    {
        
    $res mysql_query('SELECT a FROM a') or die('a');
        
    $a[] = mysql_fetch_array($res);
        
    $i++;
    }

    $time microtime(1) - $time;
    echo 
    $time.'<br><BR><BR><BR>';

    $i 0;

    $time microtime(1);

    while(
    $i 20)
    {
        
    $re[] = file_get_contents('a.txt');
        
    $i++;
    }

    $time microtime(1) - $time;
    echo 
    $time.'<br><BR><BR><BR>';
    ?>
    a.txt

    Code:
    
    1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe
    
    
    mysql

    Code:
    --
    -- Структура таблицы `a`
    --
    
    CREATE TABLE IF NOT EXISTS `a` (
      `a` varchar(261) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    --
    -- Дамп данных таблицы `a`
    --
    
    INSERT INTO `a` (`a`) VALUES
    ('1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe1wqe');
    
    
    Результат

    0.00867295265198



    0.0285441875458

    хм =\

    GreenBear
    ты прав просто хотел человеку показать что БД это не такой пожиратель ресурсов ка кнам его описывают .. файловая систему тоже грешит этим

    ---
    п.с по теме .. просто бд легче управлять всем этим .. удаление замена и т.д .. просто если так посмотреть при удалении замене в случае с БД может работать быстрее чем с файловой системой .. потому как там хватит одного апдейта .. а в файлах нужно использовать пару ф-ций ..
     
    #5 Doom123, 1 Oct 2009
    Last edited: 1 Oct 2009
  6. ChieFSS

    ChieFSS Elder - Старейшина

    Joined:
    23 Nov 2006
    Messages:
    35
    Likes Received:
    2
    Reputations:
    0
    Я бы посоветовал из базы брать адрес (или только название) к картинке и подставлять в <img src="">, а сами картинки хранить в отдельной папке.
    Плюс не надо будет реализовывать кэширование.

    Вот если посчетать сколько всего будет записей в БД, тогда можно будет сделать более точные расчёты.

    PS вот это вообще не понятно зачем надо: $re[] = file_get_contents('a.txt');
     
    #6 ChieFSS, 1 Oct 2009
    Last edited: 1 Oct 2009
  7. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    ChieFSS это было для вывода ..
    а если замена и удаление? например мне надо чтоб фота название фоты было такое
    id_(номер с 1 до 8) получается типо 45654_5.jpg например ..

    а еси чел удаляет скажем фоту 45654_4.jpg и добовляет ещё фоту .. мне ж нужно её вставить на место 45654_4.jpg а теперь иди и считай какой по счёту фоты не хватает чтоб вставить место неё .. в этом случае в БД будет быстрее
     
  8. REBUUS

    REBUUS Active Member

    Joined:
    6 Apr 2009
    Messages:
    314
    Likes Received:
    111
    Reputations:
    9
    В ФАЙЛАХ!!!!!!!!!!!!!!!!!!!!!!!!!!!
     
    2 people like this.
  9. KaMiKadZe

    KaMiKadZe Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    163
    Likes Received:
    35
    Reputations:
    19
    Чем больше база тем медленнее она работает, да и в БД никто не хранит файлы, я как минимум SQL inj смогу сделать просто загрузив файл
     
  10. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    REBUUS ммм не думаю то это так очевидно как вы это пишете =)

    например в булке есть возможность хранения изображений в БД и если не ошибуюсь эта возможность стоит по умолчанию и + для безопасности .. т.к нету папок с правами записи


    и о какой скуле идёт речь? когда внутрености файла экранируется а имя изменяется
    думаете в булке(vbulletin) маленькие БД ?
     
    #10 Doom123, 1 Oct 2009
    Last edited: 1 Oct 2009
  11. ChieFSS

    ChieFSS Elder - Старейшина

    Joined:
    23 Nov 2006
    Messages:
    35
    Likes Received:
    2
    Reputations:
    0
    А какая разница какое название у фотки будет? Вам же не надо руками в папку лазить.
    Допустим такая структура: id, filename.
    В поле filename пишите через запятую (двоеточие, кавычки) названия фоток и всё. И пускай они называются хоть 000001, хоть 987654.

    Вариантов можно миллион придумать.
     
    #11 ChieFSS, 1 Oct 2009
    Last edited: 1 Oct 2009
  12. REBUUS

    REBUUS Active Member

    Joined:
    6 Apr 2009
    Messages:
    314
    Likes Received:
    111
    Reputations:
    9
    а зачем тебе искать ? дальше иди, сделай хоть 45654_245.jpg
     
    1 person likes this.
  13. KaMiKadZe

    KaMiKadZe Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    163
    Likes Received:
    35
    Reputations:
    19
    Смотри раз экранировали ЗНАЧИТ надо обратно все это дело перевести в норму, чтобы пользователь видел картинку, а тут регулярка и она будет тормазить скрипт...
     
    1 person likes this.
  14. Gray_Wolf

    Gray_Wolf Active Member

    Joined:
    7 Mar 2009
    Messages:
    377
    Likes Received:
    135
    Reputations:
    10
    А что происходит чаще, замены фоток или просмотр?
     
    1 person likes this.
  15. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    ChieFSSэто вредит безопасности ... там уязвимость с нулл байтом есть (была) хз какая там версия пхп в любом случае оставлять загружаемое название файла глупо ИМХО
     
    #15 Doom123, 1 Oct 2009
    Last edited: 1 Oct 2009
  16. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    KaMiKadZe Оо ... ты походу не понимаешь что такое экранирование .. это не фильрация ..

    Gray_Wolf просмотр =)

    REBUUS такое вот условие .. не могу ничё с ээтим сделать
     
  17. ChieFSS

    ChieFSS Elder - Старейшина

    Joined:
    23 Nov 2006
    Messages:
    35
    Likes Received:
    2
    Reputations:
    0
    Так никто не говорит чтобы ты оставлял называния. Бери timestamp и обзывай им картинку.
     
    1 person likes this.
  18. KaMiKadZe

    KaMiKadZe Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    163
    Likes Received:
    35
    Reputations:
    19
    \'
    \"
    Экранирование ' и "
    Похоже это что ты не понимаешь =)
     
  19. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    KaMiKadZe верно .. но при экранировании в БД пишется всё в не \' а '

    так что возвращять ничё не надо .. и причём тут регулярка ?

    п.с кстате это не только ' " а всех спец символов =)
     
  20. KaMiKadZe

    KaMiKadZe Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    163
    Likes Received:
    35
    Reputations:
    19
    хм...у меня такого не было, mysql_escape_string заносило в базу \', а при выводе приходилось через регулярку заменять \' на '
    Тогда уж извини, но хранить не стоит в базе такие вещи, если знаешь что такое java сервак lineage 2 на базе mysql, то поймешь :D