-
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?
-
Das macht doch jeder Browser selbstständig, vorausgesetzt der Cache ist aktiviert.
Geändert von jannicars (14.12.11 um 17:57 Uhr)
Tutorials: Ajax JSON Chat PHP
-
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?
Hat einer vielleicht ne Ahnung?PHP-Code: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;
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?Geändert von jayplaya1 (16.12.11 um 00:07 Uhr) Grund: Doppel
-
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:
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.PHP-Code:<? SEHR KOMPLIZIERTE BERECHNUNG UND AUSGABE ?>
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ßNetiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
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
-
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ßNetiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
Das hört sich ja schonmal gut an, werds direkt morgen testen sobald ich wieder im Büro bin und Poste dann obs geklappt hat. So kommt schonmal keiner an die bildphp ran. Aber trotzdem ist das topic Problem irgendwie noch nicht gelöst.
Edit
Es muss auf jeden Fall gehen, hab gelesen das es geht, mich auch Tod gegoolt aber nichts gefunden.
wie kann ich dem Script mitteilen das er erst die bildphp aufrufen soll, wenn kein Bild, oder kein aktuelles Bild vorhanden ist? Wäre das überhaupt eine saubere Lösung?
Hier nochmal der Text der mich drauf gebracht hat:
Diesem erheblichen Nachteil gegenüber einer Verwaltung von Bildern im Dateisystem lässt sich aber mit dem selben Mitteln des Webservers begegnen. Es reicht ein Änderungszeitpunkt oder ein E-Tag zusammen mit dem Bild in der Datenbank zu speichern. Erhält der PHP-Prozess, der die Bilder ausliefert, einen Request mit "If-Modified-Since" Header, muss nur noch geprüft werden, ob das Bild sich geändert hat. Falls nicht, wird der 304-Header versendet. Dieser ganze Ablauf läßt sich in wenigen Zeilen Code realisieren und mindert diesen großen Nachteil stark..
Aber irgendwie funktioniert das noch nicht in meiner bildphpGeändert von jayplaya1 (16.12.11 um 00:00 Uhr)
-
Hey Leute, ich bins nochmal. Ersteinmal danke an sheel, jetzt ist die Datei wenigstens sicher!
Folgendes, ich bin jetzt so weit das er die Bilder aus dem Browsercache ladet, momentan geht das aber nur manuell, halt wenn ich die if anweisungen verändere. Das einzige was mir nur noch zu script fehlt ist das:Ich weiß leider nicht wie ich den Pfad zum Bild angeben soll, bzw weiß ich nicht wie ich die letzte änderung des Bildes bekomme. Könnte mir da einer Helfen?PHP-Code:$integerFileTime = filectime ('pfad/zur/dat.ei');
Das script sieht momentan so aus:
Im Enddeffekt schaue ob Alter das Bildes( Wert aus DB) mit Alter der Header Infos übereinstimmt, wenn ja gib Not Modified aus, ansonsten lade das Bild neu und schreibe neuen Header.PHP-Code:$nid = "$_GET[id]";
$result = mysql_query("SELECT image, mimetype, uploadtime FROM pics WHERE usids = $nid
");
$row = mysql_fetch_object($result);
$bildalter = $row->uploadtime;
$dauer = 525600;//ein Jahr sollte reichen
$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";
$integerFileTime = filectime ('pfad/zur/dat.ei');
// die 1 steht hier für das bildalter aus dem browsercache, also $integerFileTime, weiß aber nicht wie ich den Pfad angeben muss
if($bildalter == 1)
{header ('HTTP/1.1 304 Not Modified');
exit;}
else{
header("Content-type: $row->mimetype");
header("Expires: " . $exp_gmt);
header("Last-Modified: ".$mod_gmt);
echo $row->image;
}
-
16.12.11 15:25 #13
Hab mir nicht alles durchgelesen, aber vielleicht hilft es, den Dateinamen mit in der Datenbank zu speichern?
-
@ the snake II, das Problem hierbei wär das jeder User ein unterschiedlichen Pfad hat und das wäre ne Unwucht an Daten...
wenn ich mir die Cache Daten ausm Firefox z.B. anschaue, steht ja im response-head das Last-Modified, welches ich definiert habe. Das einzigste was ich jetzt nur noch brauch ist das Last-Modified ausm response-head per php auszulesen um das mit dem timestamp des Bildes zu vergleichen um dann zu entscheiden ob er einen OK Header setzt, oder das Bild lädt. Aber ich weiß leider nicht wie ich mein definiertes Last-Modified auslese
-
Hi
zuerst noch mal zum 304:
Jetzt hast du mich auch zum Googlen gebracht
So wie in deinem Code kannst du das nicht verwenden.
Wenn der Browser das Bild noch nicht im Cache hat, verhinderst du so das Laden.
304 darf nur dann gesendet werden, wenn bei der HTTP-Anfrage
vom Browser die Erlaubnis dazu gegeben wird.
Wie man das abfragen kann, dazu gibts hier einen Beispielcode:
http://simonwillison.net/2003/apr/23/conditionalget/
Das findet heraus, ob 304 zulässig ist.
Sonst Bild übertragen.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
Ähnliche Themen
-
Cachen im Browser
Von slimox im Forum PHPAntworten: 6Letzter Beitrag: 09.07.11, 08:40 -
Datenbank Einträge cachen / HTML-Datei generieren
Von Identität im Forum PHPAntworten: 6Letzter Beitrag: 27.05.09, 16:23 -
MP3 Stream cachen
Von Looky im Forum JavaAntworten: 0Letzter Beitrag: 29.04.08, 15:20 -
Bilder aus Inet cachen
Von ReemE im Forum PHPAntworten: 6Letzter Beitrag: 24.08.05, 17:35 -
php cachen
Von geomaster im Forum PHPAntworten: 3Letzter Beitrag: 16.10.04, 00:41



2Danke

Zitieren


Login






[PHP][Snippet] Array zu XML konvertieren