2011-11-22 66 views
2

我有一个php脚本作为随机图像生成器。脚本在数据库中查询用户的图像,并随机将路径返回到一个。一旦路径被选择,这里是负责返回图像的部分代码。如何通过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是否有任何方式通知浏览器它正在发回的图片?

回答

1

为什么没有getRandomImage是一个PHP函数,它返回图像的路径。您可以渲染页面了已填写随机图像路径。

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

然后你可以实际上真正的缓存头为你的图片,和你的带宽不会被酩酊大醉这么难。

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

+0

请不要慢请求图像名称然后请求图像? – puk

+0

我想在理论上。但这就是网络的工作原理。图像具有特定的URL,可以访问以下载该图像数据。如果从数据库中获取图片url真的是一个突破性能问题的交易,那么你很可能有更大的问题。但是如果你不能使用缓存,因为你没有独特的网址来显示你的图片,那么在他们第一次看到图片后,它可能会慢得多。 –

+0

它不是从缓慢的数据库中获取,而是我担心的http请求(我想现在已经消失了)。从本质上讲任何涉及Ajax是如此之慢,仿佛它需要一秒钟的3/4刚刚一命呜呼我与这个解决方案假设设定的图像,而加载页面的,这个问题已经不存在 – puk

0

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

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

随意使随机数发生器更随机。

+0

我不明白,这与客户端播种有什么不同? – puk

1

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

尝试增加这剧本,尝试强制浏览器不缓存它(从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 
+0

如果可以使用缓存版本,我宁愿使用它。 – puk

+1

那么,如果你想要为多个图像使用相同的路径,你不能允许缓存。 –

+0

@Squeegy我明白现在。我会用你的[解决方案](http://stackoverflow.com/questions/8220498/how-are-images-cached-when-loaded-via-php-script/8220703#8220703),而不是 – puk

0

浏览器预计同样会始终代表相同的图像。我认为,即使是根本不强制缓存的标头也不会停止浏览器在同一页面上重新使用图像。因此,每次调用它时图像源都是不同的,这非常直观。

缓存清除可能是您最好的选择。这意味着像你随机黑客那里,虽然有办法做得更好。例如,将增加的整数附加到当前时间。这样你永远不会复制网址。

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

我不知道我有客户端的图像,它们都存储在数据库中。我必须先查询它才能加载它。我只是认为这将是更快的查询和一气呵成检索图像,而不是查询,得到的路径,然后将其设置为'img.src =' – puk

+0

鉴于信息的那一点,我添加了另一个答案,可能是更好的。 –