Php 编写动态标题

Php 编写动态标题,php,image,file,header,Php,Image,File,Header,我有一个php动态生成的图像,我需要将其写入文件以便稍后调用。我的问题是,我需要这个图像包含适当的过期标题。有大量这样的文件,它们的标题会因文件而异。htaccess controls不是一个选项 如果使用以下命令将图像直接输出到浏览器,则可以写入过期标题: 标题(“内容类型:图像/jpeg”); 标题('Expires:'.gmdate('D,dmy H:i:s',$expireationdate)。”); imagepng($image,NULL) 或者,我可以将图像写入一个文件,以便稍后使

我有一个php动态生成的图像,我需要将其写入文件以便稍后调用。我的问题是,我需要这个图像包含适当的过期标题。有大量这样的文件,它们的标题会因文件而异。htaccess controls不是一个选项

如果使用以下命令将图像直接输出到浏览器,则可以写入过期标题: 标题(“内容类型:图像/jpeg”); 标题('Expires:'.gmdate('D,dmy H:i:s',$expireationdate)。”); imagepng($image,NULL)

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


但我一辈子都不知道如何将这两者结合起来,并将图像写入一个文件,同时包含其过期标题。如何编写带有expires标头的图像文件?

如果您确实希望在服务器上的文件中存储标头和内容,您可以使用:

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

然后,您的php脚本会将标题和内容写入apache Web服务器处理为“按原样发送”的文件。

我认为您最好的选择是按原样发送文件,例如:

header("Content-Type: image/jpeg"); 
header('Expires: "' . gmdate("D, d M Y H:i:s",
  $expirationDate) . '"'); 
imagepng($image, NULL);
当然,您使用php来提供静态文件,但是expire头将限制重复请求

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

因此,您将看到两种不同类型的缓存。您可以在同一个脚本中使用两个脚本的组合来执行这些操作—实际上,您可以按照自己的意愿执行

除非你能用apache设置一个标准的expire头(你说你不能,因为它是变化的),否则我相信这是你最好的(如果不是唯一的)选择

当然,这是一种错综复杂的方式

  • 设置mod_rewrite以向php脚本发送缺少图像的请求
  • 将一些会话id附加到映像请求中(因此它对于浏览器是唯一的)
  • 让php脚本发送expire头和图像内容
  • 让php脚本将真实的静态图像链接到特定于会话的图像名称
或者类似的。我会用php把它们都端上来


更新:或从中使用
mod_asis

也许你所要做的就是……什么都不做,只是将图像数据写入光盘。
根据您使用的Web服务器,静态文件(您将使用php脚本创建)的缓存机制是现成的

如果您正在使用apache的httpd,请查看和。默认情况下,httpd还将发送最后修改的头,它支持请求头。

当您的php脚本更改图像文件时,ETag也会更改和/或If-Modified,因为条件将得到满足,httpd会发送数据。否则,它将只向客户端发送一个响应,说明“没有任何更改”。

Expires是HTTP协议头。您不能将HTTP头写入文件。谢谢。我还尝试过编写一个php文件作为图像加载:fwrite($myFile),将php代码预先添加到图像文件中肯定不起作用。告诉我们您试图完成什么,也许我们可以帮助您编写一个不同的编程解决方案。我需要能够编写一个文件(.php就可以了,只要它在别处调用时看起来像一个图像)有一个非常具体的过期日期。我生成了大量这些动态图像,它们在php重新生成图像时都有不同的过期日期。我希望避免在整个文件夹上使用无缓存头,因为我有很多拨号用户,他们非常欣赏我允许的任何缓存。在设置了end as is handler,您将如何编写这样一个文件?我不完全确定如何实际编写文件头。我只需要使用php自己生成它们。是否有一个关于头语法的好参考,或者我需要知道什么才能通过此方法成功地强制编写自己的头?嗯,我不太相信这是正确的方向。这是一个有趣的替代方案,但我不确定图像是否必须存储在服务器上的文件中。修复“原始”中的问题脚本可能是一个更好的建议。我这里最大的问题是$image是一个非常长的图像生成过程的结果,所以我不想每次新用户访问图像文件时都重新运行创建$image的脚本。我认为简单的解决方案是让第一个php文件编写第二个php文件,以发送s正确的标题,然后输出原始图像数据,而无需重新生成,但似乎所述数据不喜欢写入辅助文件。请参阅上面的评论,了解我在这方面的尝试和失败。我想我找到了答案。我将png图像写入文件,然后编写php文件发送正确的过期标题和读取png图像。缺点是我正在处理两个文件,而我只希望使用一个。我能从中获得多大的性能损失?这不是因为我有很多其他选项。@Jen你说得对,你想生成并保存I