當使用gzinflate
進行解壓縮時,我發現 - 在某些 的情況下 - 以下代碼會導致內存不足錯誤。在32位Linux上使用PHP 5.3.20測試(Amazon Linux AMI,在EC2上)。gzinflate:max。避免內存不足的空間?
$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
足夠的內存,我仍然得到:
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 266143484 bytes) in foo.php on line 123
當改變的$factor
從0.9
價值0.4
,則誤差變在這種情況下。在其他情況下0.9
是可以的。
我在想:
是對真正的錯誤gzinflate
需要兩倍多的未壓縮數據的空間更多的原因是什麼?是否有其他原因? $remaining
真的是剩下的應用程序內存嗎?
你是什麼'gzinflate()'在這麼大的第一個地方? – 2013-03-02 12:27:14
'gzinflate'可能會將內存分配給臨時數據塊。你應該閱讀它的實現。 – Tchoupi 2013-03-02 12:31:17
PHP不是C,你不能真正期待'gzinflate'和PHP不需要超過未壓縮字符串的大小(即使你留有空白)。另外,PHP在內存方面相當鬆散,這可能是正常的行爲。 – Mahn 2013-03-02 12:32:36