Php gzinflate:最大空间以避免内存不足?
当使用Php gzinflate:最大空间以避免内存不足?,php,gzip,out-of-memory,Php,Gzip,Out Of Memory,当使用gzinflate解压时,我发现-在某些情况下 环境-以下代码导致内存不足错误。在32位Linux(on)上使用PHP5.3.20进行测试 虽然我保守地计算了$maxUncompressedSize的大小,希望给gzinflate足够的内存,但我仍然得到: 致命错误:第123行foo.php中允许的内存大小268435456字节已用完(尝试分配266143484字节) 将$factor的值从0.9更改为0.4时,在这种情况下,错误消失。在其他情况下,0.9正常 我想知道: 错误的原因真的是
gzinflate
解压时,我发现-在某些情况下
环境-以下代码导致内存不足错误。在32位Linux(on)上使用PHP5.3.20进行测试
虽然我保守地计算了$maxUncompressedSize
的大小,希望给gzinflate
足够的内存,但我仍然得到:
致命错误:第123行foo.php中允许的内存大小268435456字节已用完(尝试分配266143484字节)
将$factor
的值从0.9
更改为0.4
时,在这种情况下,错误消失。在其他情况下,0.9
正常
我想知道:
错误的原因真的是
gzinflate
需要两倍以上的未压缩数据空间吗?可能还有其他原因吗?$remaining
真的是应用程序可以使用的剩余内存吗?这确实是可能的。我想,问题在于内存使用情况(true)
使用
true
应该给出更高的内存使用值,因为它应该考虑所有因素 首先,什么是这么大的gzflate()
ing?PHP不是C,你不能期望gzflate
和PHP只需要未压缩字符串的大小(即使你留了边距)。另外,PHP在内存方面相当松散,这可能是正常的行为。@Pekka I缩减了API的响应,其中一些确实非常大。不幸的是,这超出了我的控制范围。无论如何,未压缩数据的大小并不重要:正如我所解释的,将$factor
的值从0.9
调整为0.4
解决了这个问题。因此,问题不在于未压缩数据的大小,而在于gzinflate
(临时)在工作时分配的内存大小。@feklee是的,问题不是剩余内存计算错误,而是gzinflate
使用了比您预期更多的内存。这不是对您问题的回答,但是移动到命令行可能是一种选择吗?内存限制在那里不适用。
$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);