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

标签 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,所以这似乎是正确的。

对此有什么想法吗?

最佳答案

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

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

我仍然觉得这很有趣,因为我可以大大降低 PHP 的内存限制。

关于PHP GD 内存使用率非常低 VS 非常高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54494027/

相关文章:

c - 链表元素不见了?

php - 在 (PHP/GD) 中调整图像大小

PHP - 将转换后的图像保存到文件夹中

PHP最左边的数字

Matlab R2017a 内存分析器给出了一个荒谬的分配内存数字

c++ - C动态成员结构

php - 将 C 转换为 PHP

PHP 和 MySQL - 比较接近成熟的日期

php - 如何在同一个表的同一列上组合 2 个 SQL 查询?

php - 使用复选框从数据库表中删除一行