で解凍すると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
から0.9
に変更する0.4
と、この場合、エラーはなくなります。その他の場合0.9
はOKです。
私は疑問に思う:
エラーの理由は、gzinflate
圧縮されていないデータの 2 倍以上のスペースが本当に必要なのでしょうか? 何か他に理由があるのではないでしょうか?$remaining
残りのメモリは本当にアプリケーションで自由に使用できるのでしょうか?