2016-05-13 34 views
2

在网站上,我使用PHP的ImageMagick扩展动态生成图像。我使用.htaccess文件到结尾是.jpg文件重写PHP文件动态生成:如何缓存PHP动态生成的图像?

RewriteRule ^([^_]+).jpg index.php?filename=$1 

我那么PHP文件中创建图像为JPG:

$img->setImageFormat('jpeg'); 

之前呼应的形象,我发出以下标题:但是

header("Content-Type: image/jpeg"); 
header('Expires: Mon, 26 Jul 2027 05:00:00 GMT'); 
header("Pragma: cache"); 
header("Cache-Control: max-age=290304001"); 

,使用Chrome的“?难道缓存”扩展名,我可以看到,所述的动态生成的图像是而不是被缓存。此外,尽管已将标头设置为Content-Type: image/jpeg,Google Chrome的控制台却说“资源解释为文档,但是以MIME类型图像/ jpeg传输”。

所以,我想缓存.htaccess的使用如下:

<filesMatch "\.(jpg)$"> 
Header set Cache-Control "max-age=290304001, public" 
</filesMatch> 

但也没有工作。

于是,我又试图加入php拓的.htaccess条件:

<filesMatch "\.(jpg|php)$"> 
Header set Cache-Control "max-age=290304001, public" 
</filesMatch> 

最后工作和图像得到缓存。所以我放心,我得到它的工作,但这种反复试验的方法让我感到不安,我不明白为什么PHP缓存头不起作用。

问题:

1)操作的方式从.htaccess文件缓存用PHP动态生成图像的正确方法缓存?

2)为什么PHP发出的缓存头有没有效果

3)为什么Chrome的控制台说:“资源解释为文档,但与MIME类型的图像/ JPEG转移”的时候,头已被设置为image/jpeg

4)是否有更好的方式缓存动态生成的图像与PHP(也许使用纯PHP没有.htaccess)?

回答

-1

尝试添加Last-Modified头:

header("Last-Modified: Fri, 13 May 2016 13:16:19 GMT");

RFC2616的日期的格式。要以这种格式生成日期,您可以使用\ DateTime :: RSS常数,例如

echo (new \DateTime())->format(\DateTime::RSS);

echo date(\DateTime::RSS);

当然日期不应当与每个请求而改变。

希望这会有所帮助!

+0

不幸的是,没有奏效。如果我禁用.htaccess缓存并添加'header(“Last-Modified:Fri,2016年5月13日13:16:19 GMT”);'我已经列出的其他PHP缓存标题,生成的图像,并且Cache-Control返回'max-age = 0,no-cache,no-store,must-revalidate' with Pragma'no-cache'。任何想法为什么PHP缓存头被完全忽略? – ProgrammerGirl

+0

你是否在图像回显后退出()?回声后是否有任何代码被执行,它可能会重写头文件? –

+0

你确定php脚本执行完毕吗? :) –