Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySql+PHP] Blob, Blob - przechowywanie obrazków w bazie danych
mariopce
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.07.2005

Ostrzeżenie: (0%)
-----


Witam

Mam pytanie, ostatnio wdałem się w interesującą konwersacje z Dr. (nie ważne którym ), który powiedział że lepiej przechowywać obrazki (jpg i inne ) w bazie danych niż w systemie plików. Oczywiście że są zalety i wady tego rozwiązania, lecz mnie interesuje prędkość tych rozwiązań. Ogólnie wiadomo że szybciej powinien działać sposób taki:

Zapisujemy obrazek do systemu plików (czyli na dysk twardy) i ścieżkę do bazy danych.
I jak chcemy wyświetlić obrazek na stronie to pobieramy z bazy danych ścieżkę do obrazka, i ładujemy obrazek. Ogólnie to zawsze tak robiłem (mysql + php).

Szukałem co jest lepsze (szybsze), w necie przechowywanie obrazków w BLOBie czy w Systemie plików.
I tutaj jest problem, ogólnie większość programistów piszę że blob jest wolniejszy.
Ale UWAGA (IMG:http://forum.php.pl/style_emoticons/default/exclamation.gif) ! nigdzie nie podaję linków do jakiś statystyk, porównań czasu.
Przeszukałem setki stron internetowych i nadal nie wiem, co jest szybsze a co wolniejsze i o ile, bo jeśli tylko o 0.00001 s to nie ma co sobie głowę zawracać, ale jeśli o 1 rząd czy o 2 rzędy to już jest problem.
Myślałem że mojego Dr. od razu uciszę argumentem wydajności, i szybkości, jednak nigdzie nie jest czarno na białym napisane, co jest szybsze (wydajniejsze).

2) pytanie, który obrazek zajmie mniej miejsca. Ten w bazie danych, czy w systemie plików.
3) czy obrazek z bazy danych, może być chashowany w przeglądarce. (tzn. z moich eksperymentów, prób - nie ponieważ za każdym odświeżeniem strony jest wczytywany na nowo. Ale może ktoś ma konkretne dane. Porównania czasów)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mariopce
post
Post #2





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.07.2005

Ostrzeżenie: (0%)
-----


Hmm, no w sumie logicznie rzecz biorąc masz racje.
Tylko dlaczego 99% wypowiedzi na forach internetowych, na pomysł przechowywania plików graficznych w bazach danych, odradza tego pomysłu ?
[wystarczy w google wpisać: "galeria blob"].
Dlaczego w każdej [ każdej nie czytałem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ale dużo] książce do PHP od podstaw do zaawansowanej przy przykładzie upladu plików, jest pokazany przykład z uploadem plików na dysk, i wpisaniem ścieżki do bazy danych.
Według mnie to nawet łatwiej jest zapisać plik do bazy danych, niż na dysk.
Hmm. Zrobiłem skrycik który testuje pobieranie z pliku i bazy danych:
  1. <html>
  2.  
  3. <body>
  4.  
  5. <?
  6.  
  7.  
  8. //funkcja do pomiatu czasu 
  9. function getmicrotime(){ 
  10. list($usec, $sec) = explode(" ",microtime()); 
  11. return ((float)$usec + (float)$sec); 
  12. } 
  13.  
  14.  
  15.  
  16.  
  17. //wczytywanie binarki z pola blob kod skryptu view1.php podam niżej 
  18. echo "z bazy danych z pola blob <br />";
  19.  
  20. $start = getmicrotime();
  21.  
  22. echo "<img src=\"view1.php\" />";
  23.  
  24. echo getmicrotime() - $start;
  25.  
  26. echo "<br /><br /><br /><br /><br />";
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36. echo "z bazy danch: sposób nazwa pliku <br />";
  37.  
  38. ////////////////////////////
  39.  
  40.  $start = getmicrotime();
  41.  
  42. //Nawiązujemy połączenie z serwerem bazy MySQL
  43. include("sql.php");
  44. //Tworzymy zapytanie wybierające z bazy MySQL zapisanej w niej
  45. //zawartość ścieżki do pliku ,
  46. $sql1="select * from obrazy2 where Id='1'";
  47. $result2=mysql_query($sql1,$conn)
  48. or die ('Błąd wykonania zapytania 1: '.mysql_error());
  49.  
  50. //tworzymy tablicę asocjacyjną $row i wczytujemy do niej
  51. //dane z wybranego rekordu tabeli. W naszym przypadku
  52. //jest to rekord 1.
  53.  
  54. $row = mysql_fetch_assoc($result2);
  55. //Z tablicy $row wydobywamy zawartość komórki "text"
  56. //i zapisujemy ją do zmiennej $grafika.
  57. $grafika=$row['text'];
  58. echo "<img src=\"".$grafika."\" />";
  59. echo getmicrotime() - $start;
  60. echo "<br /><br /><br /><br /><br />";
  61.  
  62.  
  63.  
  64. echo "z bazy nazwa pliku include<br />";
  65. $start = getmicrotime();
  66. include("obrazekzpliku.php");
  67. echo getmicrotime() - $start;
  68. echo "<br /><br /><br /><br /><br /><br /><br /><br />";
  69.  
  70.  
  71.  
  72.  
  73. //zwykłe czytanie z pliku jpg. 
  74. echo "z pliku dysk, bez php<br />";
  75. $start = getmicrotime();
  76. echo "<img src=\"view1.jpg\"/>";
  77. echo getmicrotime() - $start;
  78. echo "<br /><br /><br /><br /><br />";
  79.  
  80.  
  81. ?>
  82. </body>
  83. </html>


  1. <?PHP
  2. include("sql.php");
  3. //Tworzymy zapytanie wybierające z bazy MySQL zapisaną w niej
  4. //zawartość wczytanego wcześniej pliku wraz z jego typem MIME,
  5. //nazwą i rozmiarem.
  6. $sql1="select * from obrazy where ID_obrazy='1'";
  7. //Wykonujemy zapytanie $sql1
  8. $result2=mysql_query($sql1,$conn)
  9. or die ('Błąd wykonania zapytania 1: '.mysql_error());
  10. //tworzymy tablicę asocjacyjną $row i wczytujemy do niej
  11. //dane z wybranego rekordu tabeli. W naszym przypadku
  12. //jest to rekord 1.
  13. $row = mysql_fetch_assoc($result2);
  14. //Z tablicy $row wydobywamy zawartość komórki "obrazek"
  15. //i zapisujemy ją do zmiennej $grafika.
  16. $grafika=$row['obrazek'];
  17. //Z tablicy $row wydobywamy zawartość komórki "typ"
  18. //i zapisujemy ją do zmiennej $typpliku.
  19. $typpliku=$row['typ'];
  20. //Wysyłamy do przeglądarki nagłówek HTTP, informujący
  21. //przeglądarkę że wynik który za chwilę wyświetlimy to
  22. //obrazek w formacie określonym przez zmienną $typpliku.
  23. header("Content-type:$typpliku");
  24. //Drukujemy zawartość zmiennej $grafika,
  25. //czyli wyświetlamy zawartość naszego obrazka
  26. print $grafika;
  27. ?>



  1. <?
  2.  
  3.  
  4.  
  5. //Nawišzujemy połšczenie z serwerem bazy MySQL
  6.  
  7. $conn=mysql_connect("localhost","root","")
  8.  
  9. or die ('Błšd połšczenia z bazš MySQL: '.mysql_error());
  10.  
  11.  
  12.  
  13. //Wybieramy bazę w której mamy tabelę z polem blob
  14.  
  15. $result1=mysql_select_db("data",$conn)
  16.  
  17. or die ('Błšd podczas wyboru bazy: '. mysql_error());
  18. ?>



  1. -- phpMyAdmin SQL Dump
  2. -- version 2.11.4
  3. --
  4. -- Host: localhost
  5. -- Czas wygenerowania: 16 Mar 2008, 23:38
  6. -- Wersja serwera: 5.1.22
  7. -- Wersja PHP: 5.2.3
  8.  
  9.  
  10.  
  11. --
  12. -- Baza danych: `gielda_data`
  13. --
  14.  
  15. -- --------------------------------------------------------
  16.  
  17. --
  18. -- Struktura tabeli dla `obrazy`
  19. --
  20.  
  21. CREATE TABLE `obrazy` (
  22. `ID_obrazy` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  23. `obrazek` mediumblob NOT NULL,
  24. `typ` char(60) NOT NULL,
  25. `nazwa` char(255) NOT NULL,
  26. `rozmiar` int(10) UNSIGNED NOT NULL,
  27. PRIMARY KEY (`ID_obrazy`)
  28. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=3 ;
  29.  
  30. -- --------------------------------------------------------
  31.  
  32. --
  33. -- Struktura tabeli dla `obrazy2`
  34. --
  35.  
  36. CREATE TABLE `obrazy2` (
  37. `Id` int(11) NOT NULL,
  38. `text` varchar(255) NOT NULL,
  39. PRIMARY KEY (`Id`)
  40. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;


Ogólnie cały skrypt działa na www.mariopce.tivi.net.pl/blob/aaa.php

Podałem ten skrypt z 2 powodów:
1) Pokazać łatwość wykonania 2 sposobów dostępu do danych
2) Poprosić was o pomoc z mierzeniem czasu ładowania obrazków z bazy danych, czyli z zewnętrznego skryptu: view1.php.
Funkcja:
  1. <?php
  2. //funkcja do pomiatu czasu 
  3. function getmicrotime(){ 
  4. list($usec, $sec) = explode(" ",microtime()); 
  5. return ((float)$usec + (float)$sec); 
  6. }
  7.  
  8. $start = getmicrotime();
  9. echo getmicrotime() - $start;
  10. ?>

Mierzy tylko czas generowania strony php, bez ładowania zewnętrznych grafik.
3) Żebyście zobaczyli że pliki które pobierane są z bloba nie są cashowane przez przeglądarkę.
tzn. jak wciśniecie 5x F5 to plik graficzny z bloba będzie wczytany z bazy danych,
gdy wczytujemy z bazy danych tylko ścieżkę do pliku, to już jest inaczej, co prawda pobór ścieżki trawa, ale sam plik graficzny jest cashowany..
Chyba że w tym skrypcie popełniłem jakiś błąd ?


Jeśli dane binarne z bloba nie są cashowane przez przeglądarkę to tutaj w tym miejscu byłby największy minus, bloba. Jeśli natomiast ktoś znajdzie skrypt który powoduję ze dane binarne będą cashowane to okaże się że więcej zalet ma blob.

Teraz jeszcze jedno stwierdzenie:
Pliki graficzne można łatwiej zmieniać, np. robić miniaturki. gdy mamy dane zapisane w pliku a nie w bazie danych, [prawda czy fałsz ?]

Ogólnie to im więcej czytam o tym blobie tym więcej nie wiadomych niż wiadomych.
Dziękuje Ci za wyjaśnienie że gardłem dla plików jest sieć internetowa, może więc blob, nie jest taki straszny jak go malują, i powinniśmy przekonywać do używania blobów, zamiast systemu plików które mają wady.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.10.2025 - 16:59