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

通过php脚本加载时如何缓存图像,php,javascript,image,caching,Php,Javascript,Image,Caching,我有一个php脚本作为随机图像生成器。脚本在数据库中查询用户的图像,并随机返回一个图像的路径。一旦选择了路径,下面是负责返回图像的代码部分 header('Content-Transfer-Encoding: binary'); header('Content-Type: image/jpeg'); header('Content-Length: ' . filesize($path)); echo file_get_contents($path); 我是这样从客户那里打电话的 image.s

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

只要将
randomImage.php
重定向到一个种子版本,如果它不存在

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

可以随意使随机化器更随机。

缓存与PHP脚本无关;它发生在浏览器上

尝试将其添加到脚本中,以尝试并强制浏览器不缓存它(从):


浏览器期望相同的图像总是表示相同的图像。我认为即使是不强制缓存的标题也不会阻止浏览器重用同一页面上的图像。因此,每次调用不同的图像源时,它都是非常违反直觉的

破坏缓存可能是你最好的选择。这意味着就像你在那里随机黑客一样,尽管有办法做得更好。例如,将递增的整数追加到当前时间。这样你就不会重复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;

但实际上,您可能需要重新考虑您的策略,因为这听起来有点可疑。

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

<img src="<? echo getRandomImage() ?>">
“>
然后,您就可以使用真正的缓存头为您的图像提供服务,这样您的带宽就不会受到太大的影响


在页面渲染时在服务器端执行此操作,而不是在渲染后。在渲染后执行此操作需要更多的工作,而且正如您所发现的,也更复杂。

如果可以使用缓存版本,我更希望使用缓存版本。如果您希望将同一路径用于多个图像,则不能允许缓存。@squegy我现在意识到了这一点。我将在中使用您的缓存但是我不知道客户端有哪些图像,它们都存储在数据库中。我必须在加载它之前查询它。我只是认为一次查询和检索图像会更快,而不是查询、获取路径,然后将其设置为
img.src=
鉴于这一点信息,我添加了另一个可能更好的答案r、 我不明白,这与在客户端播种有什么不同?请求图像名称会比请求图像慢吗?理论上,我想。但这正是web的工作方式。图像有一个特定的URL,可以用来下载图像数据。如果从数据库获取图像URL真的很划算的话打破性能问题,那么你很可能会有更大的问题。但是如果你不能使用缓存,因为你的图像没有唯一的URL,那么在他们第一次看到该图像后,它可能会慢得多。不是从数据库中获取速度慢,而是我担心的http请求(我想现在已经不存在了)基本上,任何涉及Ajax的操作都非常慢,好像只需要3/4秒就可以启动。我假设使用这种解决方案,在加载页面时设置图像,这个问题不再存在。这就是想法。在呈现页面时计算路径意味着您不需要Ajax请求就可以计算出来。我只是点击了另一个按钮r概念障碍(我真的不喜欢异步
图像
行为)。我的代码分两个阶段工作。首先,代码通过
AJAx
作为
type:javascript
(我正在使用
来绕过eval)动态加载。接下来,准备好后,会调用
load=function(){…}
加载图像。但是如何将
“>
放入其中?
<img src="<? echo getRandomImage() ?>">