编写动态标题

时间:2010-04-15 13:57:00

标签: php image file header

我有一个php动态生成的图像,我需要写入文件以便稍后调用。我的问题是我需要此图像包含适当的过期标头。有大量的这些和它们的标题逐个文件制作.htaccess控件不是一个选项。

如果我将图像直接输出到浏览器,我可以编写过期标题: header(“Content-Type:image / jpeg”); header('Expires:''。gmdate(“D,d M Y H:i:s”,$ expirationDate)。''''); imagepng($ image,NULL);

或者我可以将图像写入文件以便稍后使用: imagepng($ image,$ filepath)

但我不能为我的生活弄清楚如何将这两者结合起来并将图像写入文件,同时包括其过期标题。您将如何编写带有过期标题的图像文件?

3 个答案:

答案 0 :(得分:1)

如果您确实要将标题和内容存储在服务器上的文件中,您可以使用mod_asis

在服务器配置文件中,将文件与send-as-is处理程序相关联,例如
AddHandler send-as-is asis
具有.asis扩展名的任何文件的内容将由Apache发送到客户端,几乎没有任何更改。特别是,HTTP头是根据mod_cgi规则从文件本身派生的,因此asis文件必须包含有效头,并且还可以使用CGI Status:头来确定HTTP响应代码。

然后,您的php脚本会将标头和内容写入由apache网络服务器处理为send-as-is的文件。

答案 1 :(得分:1)

我认为最好的选择就是像现在这样服务文件,例如:

header("Content-Type: image/jpeg"); 
header('Expires: "' . gmdate("D, d M Y H:i:s",
  $expirationDate) . '"'); 
imagepng($image, NULL);

当然,您使用的是php来提供静态文件,但是过期标头会限制重复请求。

更新:由于$image是生成的文件,因此在第一个请求中生成并保存图像,然后输出。在其他请求上,只输出已生成的图像。基本上expire标头控制着浏览器的缓存,而您需要在服务器上实现某种缓存,以避免多次生成相同的输出。

所以你正在看两种不同的缓存。你可以在同一个脚本中使用两个脚本的组合来实现它们 - 实际上你想要它。

除非你能用apache设置一个标准的expire头(你说你不能,因为它有所不同),我相信这是你最好的(如果不是)选择。

当然有一种错综复杂的方式

  • 设置mod_rewrite以将丢失图像的请求发送到您的php脚本。
  • 将一些会话ID添加到图像请求中(因此它对浏览器是唯一的。)
  • 让php脚本发送过期标题和图像内容。
  • 让php脚本将真实静态图像链接到会话特定图像名称。

或类似的东西。我只是使用php为他们服务。

更新:或者使用VolkerK's great answer中的mod_asis

答案 2 :(得分:0)

除了将图像数据写入光盘外,也许你所要做的就是......没有 根据你正在使用的网络服务器,一些缓存机制开箱即用于静态文件(你可以使用php脚本创建)。

如果您正在使用apache的httpd,请查看http://httpd.apache.org/docs/2.2/mod/core.html#fileetaghttp://httpd.apache.org/docs/2.2/caching.html。默认情况下,httpd还会发送最后修改过的标头,它支持If-Modified-Since个请求标头 当您的php脚本更改图像文件时,ETag也会更改和/或将满足If-Modified-Since条件并且httpd会发送数据。否则它只会向客户发送一条回复说“没有任何改变”。