使用 解压缩时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.9
,0.4
错误就会消失。在其他情况下0.9
是可以的。
我想知道:
错误的原因真的是gzinflate
需要两倍以上的未压缩数据空间吗?可能还有其他原因吗?$remaining
剩余的内存真的可以供应用程序使用吗?