Как изображения кэшируются при загрузке через скрипт php - PullRequest
2 голосов
/ 22 ноября 2011

У меня есть скрипт php, работающий как генератор случайных изображений.Сценарий запрашивает базу данных для изображений пользователя и возвращает путь к одному случайным образом.Вот часть кода, отвечающая за возврат изображения после выбора пути.

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

Я звоню из клиента вот так

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

Каждый разобновить страницу, я получаю новое изображение в случайном порядке.Однако, если я вызову getRandomImage.php несколько раз для изображений рядом, они все будут одним и тем же изображением.Если я добавлю случайное свойство к вызову, вот так

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

Фотографии станут случайными.Я полагаю, это означает, что браузер кеширует их на основе случайного свойства, которое я передал.Проблема в том, что это свойство не имеет ничего общего с реальным изображением.Два разных изображения могут быть кэшированы как одно и то же изображение, и одно и то же изображение может быть не извлечено из кэша.Есть ли способ для getRandomImage.php сообщить браузеру об отправляемой им картинке?

Ответы [ 4 ]

1 голос
/ 22 ноября 2011

Почему бы не иметь getRandomImage функцию PHP, которая возвращает путь к изображению.Вы можете отобразить страницу с уже заполненными случайными путями к изображениям.

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

Тогда вы можете фактически обслуживать свои изображения с реальными заголовками кэша, и ваша пропускная способность не будет сильно забиваться.

Делайте это на стороне сервера во время рендеринга страницы, а не после.Делать это после - это больше работы и, как вы выяснили, тоже сложнее.

1 голос
/ 22 ноября 2011

Кэширование не имеет ничего общего с PHP-скриптом;это происходит в браузере.

Попробуйте добавить это в скрипт, чтобы заставить браузер не кэшировать его (с PHP-сайт ):

header("Cache-Control: no-cache, must-revalidate");  // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");    // Date in the past
0 голосов
/ 22 ноября 2011

Браузеры ожидают, что одно и то же всегда будет представлять одно и то же изображение.И я думаю, что даже заголовки, которые вообще не заставляют кешировать, не мешают браузеру повторно использовать изображение на той же странице.Таким образом, источник изображения, который меняется каждый раз, когда вы звоните, довольно интуитивно понятен.

Сброс кэша - это, вероятно, ваш лучший выбор.Это означает, что вы случайный взлом там, хотя есть способы сделать это лучше.Например, добавление возрастающего целого числа к текущему времени.Таким образом, вы никогда не дублируете 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;

Но на самом деле, вы можете пересмотреть свою стратегию здесь, потому что она звучит немного подозрительно.

0 голосов
/ 22 ноября 2011

Просто заставьте randomImage.php перенаправить на засеянную версию, если ее нет.

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

Не стесняйтесь сделать рандомизатор более случайным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...