使用php输出图像的最佳方式


best way to output an image with php

我有一个名为"image.php"的脚本,用于计算印象,然后打印图像。

这个脚本是这样调用的:

<img src="path/image.php?id=12345" />

我的用户经常使用它,我每天看到数千个请求

所以我想知道在这个脚本结束时输出图像的最好方法是什么:

方法一(实际使用):

header("Content-type: $mime"); //$mime is found with getimagesize function
readfile("$image_url");
exit;

方法2(很确定这是最慢的):

header("Content-type: $mime");
echo  file_get_contents("$image_url");
exit;
方法3:

header('Location: '.$image_url);
exit();

方法3比方法1好/快吗?

首先,方法3在重定向到原始文件时要快得多。

前两种方法需要文件访问和读取文件,而且它们不使用浏览器缓存!

另外,当您存储呈现的图像时,您可以更好地让apache处理您的静态文件。Apache比PHP快得多,而且它使用了正确的浏览器缓存(快3到4倍并不奇怪)。

当你请求一个静态文件时,apache发送Last-Modified头如果您的客户端再次请求相同的图像,它将发送具有相同日期的If- modified - since标头。如果文件没有改变,你的服务器响应一个没有任何数据的304 Not Modified头,这为你节省了很多IO操作(除了ETAG头也被使用)

对于映像的印象计数,您可以创建一个cronjob来解析apache访问日志,这样最终用户甚至不会注意到它。但对你来说,在你的脚本中计算印象更容易然后重定向

基本上,readfile所做的是将文件直接读入输出缓冲区,而file_get_contents将文件加载到内存(字符串)中。因此,当您输出结果时,数据将从内存复制到输出缓冲区,使其比readfile慢两倍。