2013-03-16 34 views
1

我正在阅读图像从最小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); 
} 

看来所有方法的性能都是一样的。只是想知道哪些使用更多的服务器资源?有没有比这更好的方法?提前致谢。

+0

最后一种方法肯定是不必要的资源消耗(除非你想让10000%超级确定你的文件实际上是一个图像,但在大多数情况下这将是矫枉过正)。 – 2013-03-16 15:29:13

+0

@Pekka웃,所有图像都是PNG和保存在服务器中。所以前两种方法是好的? – 2013-03-16 15:32:58

+0

是的 - 尽管如果你想让它们被缓存,你必须发送你自己的缓存标题,并且通过PHP发送静态内容并不是每一种都很有效。为什么你不能把原始的PNG放在一个可以访问网页的文件夹中的任何具体原因? – 2013-03-16 15:34:24

回答

3

当用户请求黑白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

+0

+1为好答案。这里'下一次如果请求相同的大小'意味着不是由同一个用户。不同的用户每天可以在世界各地要求200x100的位置持有者。你说什么? – 2013-03-16 15:58:35

+0

@Code这将在下一次如果* any *用户请求相同大小。该文件将已经在那里。 – 2013-03-16 16:11:41