【发布时间】:2013-03-02 12:22:02
【问题描述】:
用gzinflate解压的时候发现——在某些情况下
情况 - 以下代码导致内存不足错误。在 32 位 Linux 上使用 PHP 5.3.20 进行了测试(EC2 上的Amazon Linux AMI)。
$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 的值从0.9 更改为0.4 时,在这种情况下,错误就会消失。在其他情况下,0.9 可以。
我想知道:
错误的原因真的是gzinflate 需要两倍以上的未压缩数据空间吗?可能还有其他原因吗? $remaining 真的是应用程序可以使用的剩余内存吗?
【问题讨论】:
-
你到底是什么
gzinflate()这么大? -
PHP 不是 C,你不能期望
gzinflate和 PHP 需要的大小不超过未压缩字符串的大小(即使你留有余量)。另外,PHP 在内存方面相当松散,这可能是正常行为。 -
@Pekka 我缩小了来自 API 的响应,其中一些确实非常大。不幸的是,这超出了我的控制范围。无论如何,未压缩数据的大小并不重要:正如我所解释的,将
$factor的值从0.9调整为0.4解决了这个问题。所以,问题不在于未压缩数据的大小,而是gzinflate(临时)在工作时分配的内存大小。 -
@feklee 是,问题不是剩余内存计算错误,而是
gzinflate使用的内存比您预期的要多。 -
不是您问题的答案,但可以选择移至命令行吗?内存限制不适用于那里。
标签: php gzip out-of-memory