如何通过php脚本加载图像缓存


How are images cached when loaded via php script

我有一个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是否有办法通知浏览器它正在发回的图片?

为什么不让getRandomImage是一个PHP函数,它返回到图像的路径。您可以使用已经填充的随机图像路径渲染页面。

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

那么你就可以用真正的缓存头来提供你的图像,你的带宽就不会那么大了。

在页面呈现时在服务器端执行此操作,而不是在页面呈现之后。之后再做是更多的工作,而且,正如你所发现的,也更复杂。

缓存与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

如果randomImage.php不存在,则将其重定向到种子版本

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

浏览器希望相同的内容总是表示相同的图像。而且我认为即使标头没有强制缓存,也不会阻止浏览器在同一页面上重复使用图像。所以每次调用都不一样的图片源是很反直觉的。

缓存破坏可能是最好的选择。这就意味着你可以随机破解,尽管有更好的方法。例如,向当前时间追加一个递增的整数。这样你就不会重复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;

但说真的,你可能需要重新考虑一下你的策略,因为这听起来有点可疑。