Mam skrypt PHP działający jako losowy generator obrazu. Skrypt zapytanie bazy danych dla obrazów użytkownika i zwraca ścieżkę do jednego, losowo. Oto część kodu odpowiedzialnego za zwracanie obrazu, po wybraniu ścieżki.

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

Dzwonię do tego z tego słowa

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

Za każdym razem, gdy odświeżam stronę, a losowo otrzymuję nowy obraz. Jeśli jednak nazywam getRandomImage.php wielokrotnie przez obok siebie, wszystkie będą to ten sam obraz. Jeśli dodam losową właściwość do połączenia, tak jak

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

Zdjęcia stają się losowe. Bierzemy to, że przeglądarka jest buforowanie ich w oparciu o losową własność, którą minęłam. Problem polega na tym, że ta nieruchomość nie ma nic wspólnego z rzeczywistym obrazem. Dwa różne obrazy mogą być buforowane jako ten sam obraz, a ten sam obraz może nie zostać pobrany z pamięci podręcznej. Czy jest jakiś sposób na getRandomImage.php, aby poinformować przeglądarkę o zdjęciu, który jest wysyłany?

2
puk 22 listopad 2011, 04:31

4 odpowiedzi

Najlepsza odpowiedź

Dlaczego nie ma getRandomImage być funkcją PHP, która zwraca ścieżkę do obrazu. Możesz przedstawić stronę z losowymi ścieżkami obrazu już wypełnionymi.

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

Wtedy można serwować swoje obrazy z prawdziwymi nagłówkami pamięci podręcznej, a przepustowość nie będzie się tak mocno wbić.

Zrób to po stronie serwera, gdy strona renderuje, a nie po. Robiąc to po więcej pracy i, jak się znajdujesz, jest bardziej skomplikowany.

1
Alex Wayne 22 listopad 2011, 01:01

Buforowanie nie ma nic wspólnego z skryptem PHP; Dzieje się tak w przeglądarce.

Spróbuj dodać to do skryptu, aby spróbować wymusić przeglądarkę, aby nie pamięć go (z PHP strony internetowej):

header("Cache-Control: no-cache, must-revalidate");  // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");    // Date in the past
1
Jonathon Reinhart 22 listopad 2011, 00:36

Wystarczy zrobić randomImage.php przekierować do wersji nasionej, jeśli nie jest obecny.

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

Niekwestionuj losowy losowy.

0
Byron Whitlock 22 listopad 2011, 00:35

Przeglądarki oczekują, że to samo będzie reprezentować ten sam obraz. I myślę, że nawet nagłówki, które nie ma buforowania w ogóle nie zatrzymaj przeglądarki od ponownego wykorzystania obrazu na tej samej stronie. Więc źródło obrazu, które jest inne za każdym razem, gdy zadzwonisz, jest ładny intuicyjny.

Kijanie pamięci podręcznej jest prawdopodobnie najlepszym zakładem. Oznacza to, że losowy hack tam, chociaż istnieje sposoby, aby to zrobić lepiej. Na przykład, dołączając rosnący liczbę całkowitą do bieżącego czasu. W ten sposób nigdy nie powiedziesz adresów URL.

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;

Ale naprawdę możesz tutaj przemyśleć swoją strategię, ponieważ brzmi to trochę rybne.

0
Alex Wayne 22 listopad 2011, 00:38