tutorials.de Buch-Aktion 05/2012
Seite 1 von 3 123 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
35
ZUGRIFFE
1052
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    jayplaya1 jayplaya1 ist offline Mitglied Bronze
    Registriert seit
    Sep 2011
    Beiträge
    45
    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?
     

  2. #2
    Avatar von String
    String String ist offline Mitglied Gold
    Registriert seit
    Feb 2004
    Beiträge
    238
    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
     

  3. #3
    jayplaya1 jayplaya1 ist offline Mitglied Bronze
    Registriert seit
    Sep 2011
    Beiträge
    45
    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?
     

  4. #4
    jannicars jannicars ist offline Mitglied Gold
    Registriert seit
    Jun 2011
    Beiträge
    219
    Das macht doch jeder Browser selbstständig, vorausgesetzt der Cache ist aktiviert.
    Geändert von jannicars (14.12.11 um 17:57 Uhr)
     

  5. #5
    jayplaya1 jayplaya1 ist offline Mitglied Bronze
    Registriert seit
    Sep 2011
    Beiträge
    45
    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-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 60FALSE);
       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?
    Geändert von jayplaya1 (16.12.11 um 00:07 Uhr) Grund: Doppel
     

  6. #6
    Avatar von String
    String String ist offline Mitglied Gold
    Registriert seit
    Feb 2004
    Beiträge
    238
    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-Code:
    <? 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
     

  7. #7
    jayplaya1 jayplaya1 ist offline Mitglied Bronze
    Registriert seit
    Sep 2011
    Beiträge
    45
    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
     

  8. #8
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    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, ...?

  9. #9
    jayplaya1 jayplaya1 ist offline Mitglied Bronze
    Registriert seit
    Sep 2011
    Beiträge
    45
    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
     

  10. #10
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Zitat Zitat von jayplaya1 Beitrag anzeigen
    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ß
    jayplaya1 bedankt sich. 
    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, ...?

  11. #11
    jayplaya1 jayplaya1 ist offline Mitglied Bronze
    Registriert seit
    Sep 2011
    Beiträge
    45
    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 bildphp
    Geändert von jayplaya1 (16.12.11 um 00:00 Uhr)
     

  12. #12
    jayplaya1 jayplaya1 ist offline Mitglied Bronze
    Registriert seit
    Sep 2011
    Beiträge
    45
    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:
    PHP-Code:
    $integerFileTime filectime ('pfad/zur/dat.ei'); 
    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?

    Das script sieht momentan so aus:
    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;
                         

    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.
     

  13. #13
    Avatar von the snake II
    the snake II the snake II ist offline Mitglied Gold
    Registriert seit
    Sep 2004
    Ort
    Krefeld
    Beiträge
    132
    Hab mir nicht alles durchgelesen, aber vielleicht hilft es, den Dateinamen mit in der Datenbank zu speichern?
     

  14. #14
    jayplaya1 jayplaya1 ist offline Mitglied Bronze
    Registriert seit
    Sep 2011
    Beiträge
    45
    @ 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
     

  15. #15
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    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.
    jayplaya1 bedankt sich. 
    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

  1. Cachen im Browser
    Von slimox im Forum PHP
    Antworten: 6
    Letzter Beitrag: 09.07.11, 08:40
  2. Antworten: 6
    Letzter Beitrag: 27.05.09, 16:23
  3. MP3 Stream cachen
    Von Looky im Forum Java
    Antworten: 0
    Letzter Beitrag: 29.04.08, 15:20
  4. Bilder aus Inet cachen
    Von ReemE im Forum PHP
    Antworten: 6
    Letzter Beitrag: 24.08.05, 17:35
  5. php cachen
    Von geomaster im Forum PHP
    Antworten: 3
    Letzter Beitrag: 16.10.04, 00:41