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?
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.
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
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.
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.