用PHP快速阅读和输出浏览器中的图像
我正在阅读图像从最小1x1
像素到最大1600x1600
像素。我写了三种PHP方法,并且工作正常。用PHP快速阅读和输出浏览器中的图像
// using FGC
function output_fgc($filename)
{
header("Content-Type: image/png");
echo file_get_contents($filename);
}
// using fopen
function output_fp($filename)
{
$handle = fopen($filename, 'rb');
header("Content-Type: image/png");
header("Content-Length: " . filesize($filename));
fpassthru($handle);
}
// using GD
function output_gd($filename)
{
$im = imagecreatefrompng($filename);
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
}
看来所有方法的性能都是一样的。只是想知道哪些使用更多的服务器资源?有没有比这更好的方法?提前致谢。
当用户请求黑白200x100像素图像占位符,第一次与GD创建,保存和输出,如果要求相同的大小下一次,我正在看保存的文件和输出,而不是建立新的再浏览器。
如果你可以使用Apache的mod_rewrite模块,那么有一种更高效的方法,一旦创建图像就完全不需要PHP。从那里见Create resized image cache but prevent abuse
被盗:
HTML:
<img src="images/cache/200x150-picture_001.jpg" />
的.htaccess代码:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ images/image.php?f=$1 [L]
这项技术看起来正确的大小/文件名的图像是否在存在“缓存”文件夹,只有在不存在的情况下,才会调用您的PHP脚本。您的脚本将不得不解析大小信息(如您所说的200x100
),调整大小并输出图像。下一次有人请求该映像时,Apache将静态提供服务,从而节省资源。
唯一的缺点是PHP脚本只会被调用一次,所以如果原始图像发生变化,更改将永远不会传播到调整后的版本。您可能需要偶尔擦除所有调整大小的图像以防止出现这种情况,或者在原始更改时删除所有调整大小的图像。
当使用PHP输出图像时,请务必发送缓存信息。见例如How to use HTTP cache headers with PHP
+1为好答案。这里'下一次如果请求相同的大小'意味着不是由同一个用户。不同的用户每天可以在世界各地要求200x100的位置持有者。你说什么? – 2013-03-16 15:58:35
@Code这将在下一次如果* any *用户请求相同大小。该文件将已经在那里。 – 2013-03-16 16:11:41
最后一种方法肯定是不必要的资源消耗(除非你想让10000%超级确定你的文件实际上是一个图像,但在大多数情况下这将是矫枉过正)。 – 2013-03-16 15:29:13
@Pekka웃,所有图像都是PNG和保存在服务器中。所以前两种方法是好的? – 2013-03-16 15:32:58
是的 - 尽管如果你想让它们被缓存,你必须发送你自己的缓存标题,并且通过PHP发送静态内容并不是每一种都很有效。为什么你不能把原始的PNG放在一个可以访问网页的文件夹中的任何具体原因? – 2013-03-16 15:34:24