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

时间:2010-05-13 15:44:23

标签: php gd

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

  1. 如果尚未创建,则会创建文件然后打印输出(冷却)。
  2. 如果ALREADY存在,则不需要生成新文件,而是只调用已缓存的文件。
  3. 我的问题是关于第二种情况。哪一个更快?

    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;
    3. 还有其他改善方法吗?

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

      感谢大家的帮助!

5 个答案:

答案 0 :(得分:5)

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

修改

要明确永久重定向的含义......

header('HTTP/1.1 301 Moved Permanently'); 
header('Location: http://path/to/image'); 

答案 1 :(得分:5)

也许您可以执行以下操作:

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

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

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

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule .* /img.php [L]
    

答案 2 :(得分:3)

  

还有其他改善方法吗?

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

答案 3 :(得分:0)

作为第三个(更强大的)选项:将图像缓存在数据库的二进制字段中,并在数据库中查询它。

实施所有三种解决方案并对其进行基准测试。

我猜测第一个选项(重定向)将是现实世界中最慢的选项,因为它需要与第二个选项(file_get_contents)一样多的努力,但涉及第二个请求和更多开销。 / p>

答案 4 :(得分:0)

如果可能,您还可以实现一个函数来直接在html中设置缓存图像的URL:

<img src="<?php getImageUrl('hello.jpg', 400); ?>" />

getImageUrl()将返回缓存图像的url(如果存在),否则它将返回url以动态生成调整大小的图像。