PHP GD 内存使用率非常低 VS 非常高

PHP GD memory usage very low VS very high

我一直明白使用GD处理图像会占用相当多的内存。 然而,在我们的生产服务器上,我发现使用的内存量有点过高,所以我深入研究代码,看看是否至少可以做一些改进。

调试时我没有得到预期的结果,所以我创建了一个让我感到困惑的小测试脚本。我希望有人对此有一些新的见解。

该脚本只是用于测试目的的普通脚本:

<?php

ini_set('memory_limit', '1M');

$src = __DIR__ . '/../images/image-15M.jpg';
$dest = __DIR__ . '/../images/output/resized-image-15M.jpg';

@unlink($dest);

list($srcWidth, $srcHeight, $srcType) = getImageSize($src);
$destImage = imageCreateTrueColor(1000, 1000);

$srcImage = imageCreateFromJpeg($src);

imageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, 1000, 1000, $srcWidth, $srcHeight);
imageJpeg($destImage, $dest, 80);

if (file_exists($dest)) {
    die('Image created succesfully in output-directory');
}else{
    die('Failed creating image');
}

现在您可以看到,在这个场景中,我将内存限制设置为 1M。该脚本仍然 运行 没问题。 在生产服务器上,脚本 运行 如预期内存不足。

现在我还用 500kB 的图像对此进行了测试。那个 运行 在我的开发环境中没问题,但在生产服务器上它需要高达 16M 到 运行。

我的第一个结论是生产服务器出了问题。与我相关的主要差异(实际上有很多差异,包括 OS)是 GD 的差异:

发展:

'GD Version' => '2.2.5',
'FreeType Support' => true,
'FreeType Linkage' => 'with freetype',
'T1Lib Support' => true,
'GIF Read Support' => true,
'GIF Create Support' => true,
'JPEG Support' => true,
'PNG Support' => true,
'WBMP Support' => true,
'XPM Support' => true,
'XBM Support' => true,
'WebP Support' => true,
'JIS-mapped Japanese Font Support' => false,

生产:

'GD Version' => 'bundled (2.1.0 compatible)',
'FreeType Support' => true,
'FreeType Linkage' => 'with freetype',
'T1Lib Support' => true,
'GIF Read Support' => true,
'GIF Create Support' => true,
'JPEG Support' => true,
'PNG Support' => true,
'WBMP Support' => true,
'XPM Support' => false,
'XBM Support' => true,
'WebP Support' => false,
'JIS-mapped Japanese Font Support' => false,

GD 的捆绑版本会有这样的不同吗?

然后我意识到很奇怪,我的开发脚本似乎只使用1M内存就能处理16M图像。我认为这可能通过有效的内存使用来实现,但我不确定这是否是 GD 的工作方式。 我的测试用例有问题吗?

ini_get('memory_limit')设置后测试了一下,说是1M,应该是吧

对此有什么想法吗?

我自己找到了答案。我已经找到了这个错误报告,但我没有充分阅读最后一条评论:https://bugs.php.net/bug.php?id=71093

内存消耗的差异是因为 GD 的捆绑版本使用分配给 PHP 的内存,而 GD 的 OS 版本使用它自己的内存。

我仍然觉得这很有趣,因为我可以将 PHP 的 memory_limit 降低很多。