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

时间:2019-02-02 14:35:20

标签: php memory gd

我一直都知道使用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。

我的第一个结论是生产服务器上出了点问题。与我有关的主要差异(实际上包括操作系统在内有很多差异)是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,所以这似乎是正确的。

对此有何想法?

1 个答案:

答案 0 :(得分:1)

我自己找到了答案。我已经找到了这个错误报告,但是我对最后的评论读得不够好:https://bugs.php.net/bug.php?id=71093

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

尽管我可以降低PHP的memory_limit很多,但我仍然发现这很麻烦。