1

I am reading images from minimum of 1x1 pixel to maximum of 1600x1600 pixels. I have written three PHP methods and are working perfectly.

// 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);
}

It seems performance is same for all methods. Just want to know which uses more server resources? Are there any better methods than this? Thanks in advance.

4

2 回答 2

2

当用户请求 200x100 像素占位符图像时,第一次使用 GD 创建,保存和输出,下一次如果请求相同大小,我只是读取保存的文件并输出到浏览器,而不是再次创建新文件。

如果您可以使用 Apache 的 mod_rewrite 模块,那么还有一种更有效的方法,即在创建图像后根本不需要 PHP。请参阅创建调整大小的图像缓存但防止滥用

从那里偷来的:

HTML:

<img src="images/cache/200x150-picture_001.jpg" />

.ht 访问代码:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ images/image.php?f=$1 [L]

此技术检查“缓存”文件夹中是否存在正确大小/文件名的图像,只有在不存在时,它才会调用您的 PHP 脚本。您的脚本必须解析尺寸信息(如200x100您所说)、调整大小并输出图像。下次有人请求图像时,Apache 将静态地为它提供服务,从而在此过程中节省资源。

唯一的缺点是 PHP 脚本只会被调用一次,所以如果原始图像更改,更改将永远不会传播到调整大小的版本。您可能需要偶尔擦除所有调整大小的图像以防止这种情况发生,或者如果原始图像发生更改,则删除所有调整大小的图像。

在使用 PHP 输出图像时,请务必发送缓存信息。参见例如如何在 PHP 中使用 HTTP 缓存标头

于 2013-03-16T15:46:31.747 回答
0

使用readfile($filename). 这是在 php.ini 中读取任何文件的最佳选择。

function output_rf($filename)
{
    header("Content-Type: image/png");
    readfile($filename);
}
于 2020-06-09T21:57:32.947 回答