Wie werden Bilder beim Laden über ein PHP-Skript zwischengespeichert?

  • Ich habe ein PHP-Skript, das als Zufallsbildgenerator fungiert. Das Skript fragt die Datenbank nach den Bildern des Benutzers ab und gibt den Pfad nach dem Zufallsprinzip zurück. Hier ist der Teil des Codes, der für die Rückgabe des Bildes verantwortlich ist, nachdem der Pfad ausgewählt wurde.

     header('Content-Transfer-Encoding: binary');
    header('Content-Type: image/jpeg');
    header('Content-Length: ' . filesize($path));
    echo file_get_contents($path);
     

    I rufe es vom Client aus so an

     image.src = "/database/getRandomImage.php";
     

    Jedes Mal, wenn ich die Seite aktualisiere, erhalte ich zufällig ein neues Bild . Wenn ich jedoch mehrmals getRandomImage.php für nebeneinander liegende Bilder anrufe, werden alle dasselbe Bild sein. Wenn ich dem Aufruf so eine zufällige Eigenschaft hinzufüge

     image.src = "/database/getRandomImage.php?path=" + Math.random() * 100;
     

    Die Bilder werden zufällig. Ich meine damit, dass der Browser sie auf der Grundlage der zufälligen Eigenschaft, die ich übergeben habe, im Cache speichert. Das Problem ist, dass diese Eigenschaft nichts mit dem tatsächlichen Bild zu tun hat. Zwei verschiedene Bilder werden möglicherweise als dasselbe Bild zwischengespeichert, und das gleiche Bild wird möglicherweise nicht aus dem Cache abgerufen. Gibt es eine Möglichkeit, dass getRandomImage.php den Browser über das zurückgesendete Bild informiert?

    22 November 2011
    pukDavid Yang Liu
4 answers
  • Warum sollte getRandomImage keine PHP-Funktion sein, die einen Pfad zum Bild zurückgibt? Sie können die Seite mit den bereits ausgefüllten zufälligen Bildpfaden rendern.

     <img src="<? echo getRandomImage() ?>">
     

    Dann können Sie tatsächlich Ihre Bilder mit echten Cache-Headern, und Ihre Bandbreite wird nicht so hart gehämmert.

    Führen Sie dies auf der Serverseite aus, während die Seite gerendert wird, nicht danach. Danach zu tun ist mehr Arbeit und, wie Sie herausfinden, auch komplizierter.

    22 November 2011
    Alex Wayne
  • Das Caching hat nichts mit dem PHP-Skript zu tun; Dies geschieht im Browser.

    Versuchen Sie, dies zum Skript hinzuzufügen, und versuchen Sie, den Browser zu zwingen, ihn nicht zwischenzuspeichern (von PHP-Website ):

     header("Cache-Control: no-cache, must-revalidate");  // HTTP/1.1
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");    // Date in the past
     
    22 November 2011
    Jonathon Reinhart
  • Führen Sie einfach randomImage.php zu einer abgesetzten Version um, wenn diese nicht vorhanden ist.

     if (!isset($_REQUEST['seed']))
    {
          header("Location: randomImage.php?seed="+rand());
          exit;
    }
     

    Fühlen Sie sich frei, den Randomizer zufälliger zu machen.

    22 November 2011
    Byron Whitlock
  • Browser erwarten, dass immer dasselbe Bild angezeigt wird. Und ich denke, dass sogar Header, die überhaupt kein Caching erzwingen, den Browser daran hindern, das Bild auf derselben Seite erneut zu verwenden. Eine Bildquelle, die bei jedem Aufruf anders ist, ist ziemlich kontrapunktisch.

    Cache-Busting ist wahrscheinlich die beste Wahl. Das bedeutet, dass Sie zufällig hacken, obwohl es Möglichkeiten gibt, es besser zu machen. Anhängen einer zunehmenden Ganzzahl an die aktuelle Uhrzeit. Auf diese Weise duplizieren Sie niemals URLs.

     var count = 0;
    var now = new Date().getTime();
    imgs[0].src = "/database/getRandomImage.php?" + (count++) + now;
    imgs[1].src = "/database/getRandomImage.php?" + (count++) + now;
    imgs[2].src = "/database/getRandomImage.php?" + (count++) + now;
     

    Aber wirklich, sollten Sie Ihre Strategie hier überdenken, weil sie es ist klingt etwas fischig.

    22 November 2011
    Alex Wayne