使用 PHP 脚本提供图像与直接加载图像

php
2022-08-30 17:55:48

我想监视加载某些外部图像的频率。所以我的想法是,不要像这样直接给出一个uri:

www.site.com/image1.jpg

我可以创建一个读取图像的PHP脚本,所以我构建了一个PHP文件,我的HTML看起来像这样:

<img src="www.site.com/serveImage.php?img=image1.jpg">

但我不知道如何从磁盘读取图像并将其返回。是返回字节数组还是设置内容类型?

亲切的问候,米歇尔


答案 1

通过脚本发送图像对于其他事情(如按需调整大小和缓存)非常有用。

正如Pascal MARTIN所回答的那样,函数和这些标头是要求:readfile

  • 内容类型
    • 此内容的哑剧类型
    • 例:header('Content-Type: image/gif');
    • 查看函数mime_content_type
    • 类型
      • image/gif
      • image/jpeg
      • image/png

但是,除了明显的内容类型之外,您还应该查看其他标头,例如:

  • 内容长度
    • 以八位字节为单位的响应正文的长度(8 位字节)
    • 例:header('Content-Length: 348');
    • 查看函数文件大小
    • 允许更好地使用连接。
  • 上次修改时间
    • 所请求对象的上次修改日期,采用 RFC 2822 格式
    • 例:header('Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT');
    • 请参阅函数文件mtime日期,将其格式化为所需的RFC 2822格式
      • 例:header('Last-Modified: '.date(DATE_RFC2822, filemtime($filename)));
    • 如果文件修改时间相同,则可以在发送 304 后退出脚本。
  • 状态代码
    • 例:header("HTTP/1.1 304 Not Modified");
    • 您现在可以退出,不再发送图像

对于上次修改时间,请在 中查找此时间$_SERVER

  • 如果修改自
    • 允许在内容未更改时返回 304 未修改
    • 例:If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
    • 是用钥匙$_SERVERhttp_if_modified_since

HTTP 标头响应的列表


答案 2

要实现这样的目标,您的脚本需要:

  • 发送正确的标题,这取决于图像的类型:图像/ gif,图像/ png,图像/ jpeg,...
  • 发送图像的数据
  • 确保没有发送任何其他内容(没有空格,没有任何东西)

这是使用header函数完成的,使用一些类似如下的代码:

header("Content-type: image/gif");

header("Content-type: image/jpeg");

或者其他什么,取决于图像的类型。


要发送图像的数据,您可以使用readfile函数:

读取文件并将其写入输出缓冲区。

这样,在一个函数中,您可以读取文件并输出其内容。


作为旁注:

  • 您必须设置一些安全性,以确保用户无法通过脚本请求他们想要的任何内容:您必须确保它仅从您期望的目录中提供图像;例如,没有什么比这样应该没问题了。serveImage.php?file=/etc/passwd
  • 如果您只愿意获取每天加载文件的次数,那么解析Apache的日志文件可能是一个好主意(例如,通过cron每天在00:05运行的批处理,解析前一天的日志);你不会有实时统计数据,但它需要更少的资源在你的服务器上(没有PHP来提供静态文件)

推荐