如何使用PHP动态生成图像?

时间:2016-05-13 12:46:26

标签: php image .htaccess caching header

在网站上,我使用PHP的ImageMagick扩展动态生成图像。我使用.htaccess文件将以.jpg结尾的文件重写为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" 是否已缓存?"扩展,我可以看到动态生成的图像被缓存。此外,谷歌Chrome控制台正在说" 资源被解释为文档但是使用MIME类型转移图像/ jpeg "尽管已将标题设置为Content-Type: image/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的控制台会将&#34; 资源解释为文档,但使用MIME类型转换为image / jpeg &#34;标题何时设置为image/jpeg

4)有没有更好的方法来使用PHP缓存动态生成的图像(可能使用纯PHP而不使用.htaccess)?

1 个答案:

答案 0 :(得分:-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);

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

希望这有帮助!