4

使用 解压缩时gzinflate,我发现 - 在某些情况下 - 以下代码会导致内存不足错误。在 32 位 Linux( EC2上的Amazon Linux AMI )上使用 PHP 5.3.20 进行了测试。

$memoryLimit = Misc::bytesFromShorthand(ini_get('memory_limit')); // 256MB
$memoryUsage = memory_get_usage(); // 2MB in actual test case
$remaining = $memoryLimit - $memoryUsage;
$factor = 0.9;
$maxUncompressedSize = max(1, floor($factor * $remaining) - 1000);
$uncompressedData = gzinflate($compressedData, $maxUncompressedSize);

虽然,我保守地计算了大小$maxUncompressedSize,希望给gzinflate足够的内存,我仍然得到:

致命错误:第 123 行的 foo.php 中允许的内存大小为 268435456 字节已用尽(尝试分配 266143484 字节)

$factor在这种情况下,将from的值更改为 时0.90.4错误就会消失。在其他情况下0.9是可以的。

我想知道:

错误的原因真的是gzinflate需要两倍以上的未压缩数据空间吗?可能还有其他原因吗?$remaining剩余的内存真的可以供应用程序使用吗?

4

1 回答 1

1

这确实是可能的。恕我直言,问题在于memory_get_usage(true).

usingtrue应该给出更高的内存使用值,因为应该考虑到一切。

于 2013-03-23T17:01:54.603 回答