Bilder aus Datenbank cachen

jayplaya1

Mitglied
Hey Leute, wäre echt nett von euch wenn ihr mir mal ein bisschen auf die Sprünge hilft!

Folgendes: Die Bilder von meiner Website sind in Datenbanken gespeichert ( Vorteil, oder Nachteil dieser Art des Speicherns sei erstmal egal). Nun ist es aber so das die Browser bei jedem Reload die Bilder praktisch neu aus der DB anfodern, was natürlich nicht so schon ist. Ich habe vor kurzem gelesen das man die Bilder irgendwie Cachen kann und dem Browser irgendwie mitteilen kann, das er erst neue Bilder anfodern soll, wenn es auch neue, bzw aktualisiert Bilder gibt.
Nun zu meiner Frage, wie stelle ich das an?
 
Zusammenfassung wie ich es lösen würde:

-> Beim Aufruf prüfen, ob das Bild als Datei vorhanden ist.
-> Wenn ja, einfach eine Weiterleitung auf das Bild.
-> Wenn nein, das Bild aus der DB laden und anzeigen.
-> Angezeigtes Bild in Datei speichern, die oben geprüft wird.

Mit nem MD5-Hash kannst du die Aktualität der DB schnell überprüfen (also ob ein neues Bild in der DB liegt).

paD
 
sorry aber versteh ich nicht ganz, also den ablauf schon, aber die ausführung:)

Sagen wir die Bilder sind noch nicht auf der Eigenen Festplatte, jetzt sollen die Bilder also ausgelesen werden und auf der Festplatte gespeichert werden. Du meinst mit einem MD5 Hash kann die Aktualität schnell üperprüft werden, aber momentan erzeuge ich fürs Bild noch keinen MD5 Hash, lediglich ein Timestamp. Reicht da nicht irgendwie eine Kombination aus UserID und Timestamp als Bildtitel? Und wenn ja wie speichere ich diese Bilder auf der Festplatte, bzw im Browsercache?
 
Ja sollte er eigentlich schon, aber bei Bilder aus der Datenbank kennt er das Alter nicht und läd sie deswegen immer neu. Wie kann ich es also so einrichten das der Browser das Alter der Bilder kennt und sie nicht immer wieder neu lädt?

habs jetzt mal so probiert, aber der Cached die Bilder immer noch nicht:( Was mach ich Falsch?
PHP:
session_start();
include $_SERVER['DOCUMENT_ROOT'].("...");
if(!isset($_SESSION['ID']))
{
echo"<meta http-equiv=\"refresh\" content=\"0; URL=...\">";
die;
}
//keine angst, ist orginal abgesichert
$nid = "$_GET[id]"
	
  $result = mysql_query("SELECT image, mimetype,height,uploadtime
 FROM profpics WHERE from_user = $nid AND profbildact = 1
	");
   $row = mysql_fetch_object($result);
    $bildalter = $row->uploadtime;
	//in minuten. soll halt solang gecached werden wies nur geht
   	$dauer = 1500000;
	$exp_gmt = gmdate("D, d M Y H:i:s", $bildalter + $dauer * 60) ." GMT";
	$mod_gmt = gmdate("D, d M Y H:i:s", $bildalter) ." GMT";
header("Content-type: $row->mimetype");
header("Expires: " . $exp_gmt);
header("Last-Modified: " . $mod_gmt);
header("Cache-Control: public, max-age=" . $dauer * 60);
// Speziell für MSIE 5
header("Cache-Control: pre-check=" . $dauer * 60, FALSE);
   echo $row->image;

Hat einer vielleicht ne Ahnung?
Und nur mal nebenbei gefragt, hat man keine session, kann man Bilder per id nicht aufrufen, aber wie schütze ich diese Datei vor Aufrufen mit sessionwerten, ohne den Odner zb. mit einer HTACESS zu verschlüsseln?
 
Zuletzt bearbeitet:
Morgen,

also unter einem PHP-Cache für irgendwelche Dateien, versteht man eigentlich, dass die Ausgabe des Scriptes bereits auf dem Server gespeichert wird. Häufig bei Template-Systemen der fall.
Also ein Beispiel:

PHP:
<? SEHR KOMPLIZIERTE BERECHNUNG UND AUSGABE ?>

Würde diese Datei gecachet werden, wird auf dem Server eine Datei gespeichert, die keine PHP-Datei mehr ist, beziehungsweise nicht mehr die komplizierte Berechnung tätigt, sondern nur noch die vorher berechnete Ausgabe ausgibt. Und in dem falle einer Änderung, nur einmal aufgerufen wird - danach wird wieder nur der Cache ausgegeben.

In deinem Fall habe ich das so verstanden, dass du die Bilder nicht immer aus der Datenbank laden willst, sondern einfach das Bild, nochmal anzeigen willst.

Den Cache auf dem Clienten, also bei dem der sich das Bild anschaut, kannst du keinen Einfluss nehmen. Du könntest ihm höchstens sagen, dass er die Bilder nicht Cachen soll. Aber wenn der Client den Cache ausgeschaltet hat, kannst du ihm nicht zwingen, die Bilder aus dem Cache zu laden.


Wieso er das jetzt so genau in deinem fall nicht aus dem Browsercache läd, weiß ich nicht.

paD
 
Hey genau darum gehts, ich will das Bild nicht immer wieder laden, sondern einfach nur wieder anzeigen lassen. Dachte das sowas auch eine Art caching ist. Aber wie mach ich das nun das er nicht immer wieder neu lädt? Muss ja auf jeden Fall gehen, bloß weiß ich nicht wie. Hab gelesen das der Browser immer wieder neu lädt, weil er keine Infos über das alter des Bildes hat. Soll man irgendwie per http Header steuern können. Aber in,meiner Bild php bringt das nichts. Was soll ich sonst machen? Und hat einer noch ne Ahnung wie ich die bildphp vor aufrufen schützen kann, ohne das ich Ordner per htaccess sperren muss? Übrigens, das Forum hier ist echt super und freundlich! Dauert zwar manchmal mit antworten, aber das ist egal! Hab schon so unfreundliche foren erlebt!
Beste grüße aus Berlin
 
Hi

mit dem header-Expires und Last-Modified sollte das schon so passen.

Nur...bist du dir sicher, dass der Cache nicht verwendet wird?
Wenn der Cache verwendet wird, bedeutet das nicht,
dass deine PHP-Datei nicht aufgerufen wird.
Die muss in jedem Fall arbeiten.

Ablauf, wenn das Bild nicht im Cache ist:
Browser braucht ein Bild.
Browser sucht es im Cache, findet es nicht.
Ruft die PHP-Datei auf.
Bekommt header-Zeug, ob er das Bild cachen darf.
Bekommt das Bild.
Zeigt es an.

Ablauf, wenn das Bild im Cache ist:
Browser braucht ein Bild.
Browser sucht es im Cache, findet es.
Ruft trotzdem die PHP-Datei auf.
Bekommt header-Zeug, ob das gecachte Bild noch aktuell genug ist (Annahme: ja).
Browser will das Bild nicht mehr aus dem Internet.
PHP weiß das aber nicht und schickt das Bild auch.
Derweil hat es der Browser schon längst von der Festplatte geholt
(die meistens schneller ist als das Internet).

Die PHP-Seite schickt das Bild also in jedem Fall.
Nur wird das Bild beim Benutzer (von der Festplatte aus) schneller angezeigt.
Nur dafür ist der Cache, um die Wartezeit für den Benutzer zu verkürzen.


Und das mit der Session und htaccess...was meinst du?

Gruß
 
sagen wir mal ich hab eine Seite wo zb 20 Bilder zu sehen sind. Diese werden natürlich per src angezeigt und das Bild ist meine oben gepostete php Datei. Jetzt werden alle 20 Bilder immer wieder neu von der Datenbank angefodert, weil der Browser oder wer auch immer nicht weiß ob das Bild noch aktuell ist. Ich glaub ich hab mich nicht richtig ausgedrückt. Es soll jetzt also nicht immer wieder das Bild aus der Datenbank angefodert werden, sondern vom Cache oder so geholt werden, solange bis das Bild neu ist. Ich bin jetzt aber irgendwie mit meinem englisch am ende.
Ich glaube deine letzte Version trifft zu, also das Bild im Cache ist. Immer wenn ich aktualisiere scheints so als sei das Bild da, aber milisekunden später wird das Bild nochmal geladen, scheint zumindest so weil det Bildaufbau richtig zu sehen ist. Wie kann ich überprüfen ob das der Fall ist und wenn ja, wie kann ichs unterbinden?

Mit Session und htaccess meine ich ebenfalls meine oben gepostete php. Ich will halt nicht das man die php per URL Eingabe aufrufen kann und mittels id Anhang theoretisch alle Bilder anschauen kann. Meine Seite hat ein Login und ohne Session kann man die Datei nicht aufrufen, aber ist man registriert, könnte man theoretisch die URL der bildphp eingeben und sich alle Bilder anschauen. Das möchte ich natürlich unterbinden, aber am besten so ohne den ganzen Ordner in dem die Datei liegt per htaccess zu sperren, weil sonst funktioniert so der bilderaufruf ohne passworteingabe auf der Seite nicht megr:) hoffe du weißt was ich meine. Und sorry wegen der komischen Schreibweisen, schreib gerad vom gandy und da ises ein bissl eklig
 
sagen wir mal ich hab eine Seite wo zb 20 Bilder zu sehen sind. Diese werden natürlich per src angezeigt und das Bild ist meine oben gepostete php Datei. Jetzt werden alle 20 Bilder immer wieder neu von der Datenbank angefodert, weil der Browser oder wer auch immer nicht weiß ob das Bild noch aktuell ist. Ich glaub ich hab mich nicht richtig ausgedrückt. Es soll jetzt also nicht immer wieder das Bild aus der Datenbank angefodert werden, sondern vom Cache oder so geholt werden, solange bis das Bild neu ist. Ich bin jetzt aber irgendwie mit meinem englisch am ende.
Noch einmal: Falls wir noch immer vom gleichen (Browser-)cache reden,
geht das nicht.

Der Browser will jedenfalls einmal immer die header-Infos,
ob er sein gecachtes Bild noch verwenden kann.
Dh., er startet die PHP-Datei.

Und auch, wenn er das Bild aus dem Netz nicht mehr will, weil er ein passendes im Cache hat,
weiß das PHP nicht und holt es trotzdem aus der DB.
Nur der Browser nimmts dann nicht mehr.


@Session etc.:
Ah, verstehe.

Kommt gleich....

edit:

htaccess ist in dem Fall keine Lösung, weil das
(alleinstehende) Bilderphp ja zugreifbar bleiben muss.

Eine Möglichkeit:

1) Mach eine zusätzliche DB-Tabelle, die als Spalten
einen String (30 Buchstaben oder so, key), einen Timestamp und ein int (für Bilderid) hat.

2) In der PHP-Datei, in der das HTML generiert wird, und auch die img mit
der PHP-Bilderquelle eingefügt werden, muss dann ja praktisch die Erlaubnis erteilt werden,
ein bestimmtes Bild einmal abzurufen.
Dafür machst du in der Tabelle einen neuen Eintrag:
Das int ist eben die Bildnummer
Timestamp wird der aktuelle Zeitpunkt
In den String kommt irgendeine komische, schwer zu erratende Zeichenfolge
(zB Timestamp+Bildnummer+Zufallszahl aneinanderhängen und dann sha1 davon).
Der String muss in der Tabelle eindeutig sein.
Der String wird beim img-src-PHP als Parameter angehängt (?key=...)

3) In der Bilderphp:
Vor allen anderen Sachen löscht du alle Tabelleneinträge, deren Timestamp älter als zB. 10 Sekunden ist. Um Müllanhäufung zu vermeiden.

Dann prüfst du, ob zum übergebenen key ein Tabelleneintrag existiert.

Wenn ja: Diesen Eintrag löschen, passenden Header und Bild ausliefern
Wenn nein: Vebotenmeldung schicken (mit Nicht-Cache-Header).

Gruß
 
Zurück