我在php中制作了一个图像缩放器。调整图像大小时,它会使用新维度缓存新的jpg文件。下次你打电话给确切的 img.php?file = hello.jpg& size = 400 时,它会检查是否已经创建了新的jpg。
我的问题是关于第二种情况。哪一个更快?
header('Location: cache/hello_400.jpg');die();
$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
感谢大家的帮助!
答案 0 :(得分:5)
我会选择永远不会将数据打印到浏览器。两种方案都应该永久重定向到生成的图像。除非图像尚不存在,否则会在发送位置标题之前创建。
修改强>
要明确永久重定向的含义......
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://path/to/image');
答案 1 :(得分:5)
也许您可以执行以下操作:
<a href="/img/resizable/hello_400.jpg>
)。$_SERVER["REQUEST_URI"]
来判断应调整哪个图像。这样,您可以获得一些好处:
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以动态生成调整大小的图像。