Skocz do zawartości

Cache'owanie dynamicznych obrazkow (BLOB)


jesu

Rekomendowane odpowiedzi

Mam nastepujacy skrypt zdjecie,php

<?php
if (isset($_GET['id']))
{
$id=$_GET['id'];
header("Content-type: image/jpeg");
$zdjecie_res=mysql_query("SELECT logo FROM content WHERE id='".$id."'");
$zdjecie=mysql_fetch_assoc($zdjecie_res);
echo $zdjecie["logo"];
}
else
{
header("Location:../index.php");
}
?>

Nie zroblem jeszcze base64 encode/decode bo wgrywalem pliczki (8kb kazdy) z poziomu phpmyadmina. Ale nie o to chodzi

Obrazki sie ladnie wyswietlaja gdy w index.php dam

echo '<td class="logo"><img src="fun/zdjecie.php?id='.$wyswietl["id"].'" alt=""></img></td>';

z tym ze linki (we właściwościach) mają postać na przyklad

mojadomena/fun/zdjecie.php?id=19

Jak to zamienic na

mojadomena/19.jpg

tzn aby ?$id -> $id.jpg ?

Odnośnik do komentarza
Udostępnij na innych stronach

To nie dziala. Przede wszystkim nie odwoluje sie w zaden sposob do zdjecie.php, jak mam niby przekazac tu parametr? ;)

Po prostu chce zeby to szybciej dzialalo jak beda w cache, bo jeszcze jak beda wieksze to mi serwer zamuli jak za kazdym razem bede selecta robil

A moze zoptymalizowac po prostu zapytania i podmieniac widoczny URL javascriptem ?

Odnośnik do komentarza
Udostępnij na innych stronach

W pliku .htaccess dajesz:

RewriteEngine On
RewriteRule ^([0-9]+)\.jpg$ /fun/zdjecie.php?id=$1 [L]

Wtedy wszystkie wywołania pliku XX.jpg spowodują wyświetlenie dokumentu fun/zdjecie.php?id=XX

Powinieneś też wysłać do przeglądarki odpowiednie nagłówki które poinformują że chcesz cachować ten plik.

W ogóle nie bardzo rozumiem po co ta zabawa z trzymaniem obrazków w bazie ;) Nie lepiej zapisać normalnie?

Odnośnik do komentarza
Udostępnij na innych stronach

1. Przetrzymywanie rysunków w bazie jest bardzo nieoptymalnym rozwiązaniem.

2. W swoim skrypcie masz generowane obrazki tylko w przypadku, gdy masz nawiązane połączenie z bazą danych. Nikt nie będzie nikomu mógł wysłać bezpośredniego adresu do obrazka, więc sytuacja jest inna, niż gdybyś miał "normalny" plik graficzny.

Mógłbyś to inaczej rozwiązać. Tworzysz nowy plik, image.php. W pliku tym ustawiasz odpowiednie nagłówki, nawiązujesz połączenie z bazą i tabelą, w której przechowujesz obrazki. Potem ktoś się odwołując do tego skryptu, generuje obrazek. No i łatwo też byłoby podstawić do tego uniwersalne mod_rewrite, przez co adres byłby zawsze taki sam - zawsze aktualny.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Przechowywanie grafiki w bazie danych to zdecydowanie zły pomysł:

- takie bazy nie przeniesiesz za pomocą phpmysqladmina;

- przy dużej liczbie grafik baza też będzie duża co za tym idzie mogą pojawiać się problemy z wydajnością zapytań;

Na szczęście przerobienie tego na klasyczne grafiki w plikach jest stosunkowo proste.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Zawsze można uzyć jakiegoś lepszego klienta mysql, ja tam polecam wszystko ze stajni EMS (np. ems sql manager)

i też nie trzeba mieć zdalnego dostepu do bazy danych wystarczy localhost.

Ale fakt faktem że trzymanie obrazków w bazie to najczestszy pomysł "młodych" programistów który i mnie jakieś 10 lat temu nie ominął :D

Wiec nie bede krytykował aż tak tego pomysłu jak chce to niech ma , jak powalczy troche z problemami to sie nawróci na lepsze metody.

Co do samego problemu to

MOżna zrobić tak:

RewriteEngine On

RewriteRule ^obrazki\.jpg$ /fun/zdjecie.php [L]

A potem w kodzie PHP wydłubać numer to już w sumie jak kto woli.

Jezeli chcesz mieć cache zawsze możesz zapisywać obrazki na dysku i je wyświetlać

Czyli w .htaccess sprawdzasz czy podany plik istnieje jak nie istnieje to wywołaj PHP , w ez publish nazywa sie to static cache :D

Odnośnik do komentarza
Udostępnij na innych stronach

IMHO takie cachowanie mija się z celem, bo cache następuje u usera, a nie na serwerze więc każdy nowy user "pobierze" obrazek z bazy. W serwisach o zwiększonym obciążeniu grafiki powinny być jako pliki zapisane do tego serwowane nie przez apache, ale wydajniejsze serwery HTTP jak lighthttp, nginx.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

<?php
 ob_start();
 function & db_img($id)//pobieranie obrazkow
 {
  $zdjecie_res = mysql_query("SELECT logo FROM content WHERE id='" . $id . "'");
  $zdjecie = mysql_fetch_assoc($zdjecie_res);
  //dodac obsluge bledow mysql
  return $zdjecie["logo"];
 }

 function show_img(&$img)//wyswietlanie obrazkow
 {
  header("Content-type: image/jpeg");
  header('Cache-Control: max-age=86400');
  echo $img;
 }



 if (isset($_GET['id']) && is_numeric($_GET['id'])) {
  // numeryczne id - znajdz i wyswietl
  if (file_exists('img/' . $_GET['id'] . '.jpg') && time() - filemtime('img/' . $_GET['id'] . '.jpg') < 14400) {
	  // czas cache'owania w sekundach
	  //jezeli jest w cache i nie wymaga uaktualnienia - wyswietl
	  show_img(file_get_contents('img/' . $_GET['id'] . '.jpg', FILE_BINARY));
  } else {
	  // jezeli stary lub brak w cache uaktualnij/zapisz i wyswietl
	  $img = db_img($_GET['id']);
	  $file = fopen('img/' . $_GET['id'] . '.jpg', "wb");
	  flock($file, 2);
	  fwrite($file, $img);
	  flock($file, 3);
	  fclose($file);
	  show_img($img);
  }
 } else {
  header("HTTP/1.0 404 Not Found");
  exit("bye bye");
 }
?>

+ w/w zmiany w .ht i <img />

nihil fit sine causa

Odnośnik do komentarza
Udostępnij na innych stronach

Mam nastepujacy skrypt zdjecie,php
<?php

if (isset($_GET['id']))

{

[b]$id=$_GET['id'];[/b]

header("Content-type: image/jpeg");

$zdjecie_res=mysql_query("SELECT logo FROM content [b]WHERE id='".$id."'"[/b]);

[ciach]

Jeśli jest dokładnie tak jak napisałeś, to tu wydaje mi się, że masz podatność na SQL Injection - to tak 'obok' problemu tematu ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Przerób to na pliki, przechowywanie grafiki w bazie jest tak nieoptymalne, że nawet szkoda gadać - chociaż te 2 rodzaje cache to nie taki głupi pomysł to skomplikowany do zrealizowania (jeśli używasz max-age to nieaktualne pliki użytkownik zobaczy nawet po zmianie). Jeśli dobrze nad tym kilka dni nie pomyślisz i nie przetestujesz pod kilkoma przeglądarkami to nie będzie dobrze działać.

IMHO takie cachowanie mija się z celem, bo cache następuje u usera, a nie na serwerze więc każdy nowy user "pobierze" obrazek z bazy.
Przynajmniej każdy user nie będzie tego obrazka pobierał od nowa przy każdym odświerzeniu witryny.

Jeśli w pliku .php nie wstawisz nagłówków mówiących o cache to właśnie to się stanie, więc wtedy to już w ogóle będzie nieopisana masakra.

do tego serwowane nie przez apache, ale wydajniejsze serwery HTTP jak lighthttp, nginx
No włąśnie i tutaj kolejny problem bo ngnixem takiego obrazka z bazy nie zaserwujesz bez wykorzystania wolnego CGI.
Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności