调用缓存图像时哪个更有效/更快?

And*_* SK 7 php gd

我在php中制作了一个图像缩放器.调整图像大小时,它会使用新维度缓存新的jpg文件.下次你调用完全img.php?file = hello.jpg&size = 400时,它会检查是否已经创建了新的jpg.

  1. 如果尚未创建它,它会创建文件然后打印输出(很酷).
  2. 如果ALREADY存在,则不需要生成新文件,而只是调用已经缓存的文件.

我的问题是关于第二种情况.哪个更快?

  1. 重定向: header('Location: cache/hello_400.jpg');die();
  2. 抓取数据并打印缓存的文件: $data = file_get_contents('cache/hello_400.jpg'); header('Content-type: '.$mime); header('Content-Length: '.strlen($data)); echo $data;

还有其他方法可以改善吗?

如果有人想要生成的代码,请查看:http: //egobits.com/misc/img.phps

感谢大家的帮助!

Mat*_*att 5

我会选择永远不会将数据打印到浏览器.两种方案都应该永久重定向到生成的图像.除非图像尚不存在,否则会在发送Location标头之前创建.

编辑:

只是要清楚我的意思是永久重定向...

header('HTTP/1.1 301 Moved Permanently'); 
header('Location: http://path/to/image'); 
Run Code Online (Sandbox Code Playgroud)


Kra*_*rab 5

也许你可以做以下事情:

  1. 为这些图像设置一些目录.
  2. 链接到此目录中的图像(<a href="/img/resizable/hello_400.jpg>).
  3. 如果图像尚不存在,请将您的网络服务器设置为重定向到您的php脚本.如果您使用的是Apache,那么简单的.htaccess就可以了.在PHP中,您可以$_SERVER["REQUEST_URI"]从中了解应调整大小的图像.
  4. 您的脚本保存并回显图像(但仅在第一次调用时).

这样,您可以获得一些好处:

  • 图像作为任何其他静态文件缓存(在代理或浏览器中).
  • 不必为每个请求调用PHP来重定向或输出静态数据.
  • 您将实现If-modified-since和其他与缓存相关的标头留给Web服务器.
  • 链接看起来更好:-)

/ img/resizable文件夹中的示例.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /img.php [L]
Run Code Online (Sandbox Code Playgroud)


You*_*nse 3

还有其他方法可以改善这一点吗?

是的。

有一种方法只发送 HTTP 标头,而不发送任何内容:条件获取。
您可以查看类似的脚本http://shiftingpixel.com/2008/03/03/smart-image-resizer/来实现