Edit report at http://bugs.php.net/bug.php?id=51155&edit=1
ID: 51155 Updated by: paj...@php.net Reported by: flavius dot as at gmail dot com Summary: serialize() crashes with unreasonable/unexplicable "out of memory" for objects Status: Feedback Type: Bug Package: SPL related Operating System: ArchLinux x86_64 PHP Version: 5.3.1 New Comment: That's unrelated to this bug, disable imap to test a new build. However, about this error, get a decent c-client and it will work (like less than 4-5 years old). Previous Comments: ------------------------------------------------------------------------ [2010-03-04 14:26:28] flavius dot as at gmail dot com Using it gives the configure error: configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information. ------------------------------------------------------------------------ [2010-03-01 17:02:22] j...@php.net Please try using this snapshot: http://snaps.php.net/php5.3-latest.tar.gz For Windows: http://windows.php.net/snapshots/ ------------------------------------------------------------------------ [2010-02-26 13:41:59] flavius dot as at gmail dot com Oh and I've forgot to mention, there's plenty of RAM and swap space before running php -f: free -m total used free shared buffers cached Mem: 1975 1732 243 0 131 1027 -/+ buffers/cache: 573 1402 Swap: 5718 0 5718 ------------------------------------------------------------------------ [2010-02-26 13:38:28] flavius dot as at gmail dot com Updated OS: ArchLinux x86_64 ------------------------------------------------------------------------ [2010-02-26 13:35:13] flavius dot as at gmail dot com Description: ------------ When serializing a SplFixedArray with serialize(), the script dies with "Fatal error: Allowed memory size of 134217728 bytes exhausted" The "expected result" works and allocates at most 20.96 mb for $cnt = 8565 on line 15. The "actual result" crashes when serialize()'ing with $cnt only incremented by one, which is not understandable. The actual values may vary, but if you play enough with it you'll find at which amount of items serialize() has that spark. Then you can toggle to using plain arrays on line 17, and that problem will disappear, although arrays actually consume more memory (in my experiments around 1.2 mb more). Reproduce code: --------------- 1 <?php 2 function rand_str($length = 32, $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz1234567890') { 3 $chars_length = (strlen($chars) - 1); 4 $string = $chars{rand(0, $chars_length)}; 5 for ($i = 1; $i < $length; $i = strlen($string)) { 6 $r = $chars{rand(0, $chars_length)}; 7 if ($r != $string{$i - 1}) $string .= $r; 8 } 9 return $string; 10 } 11 function convert($size) { 12 $units=array('b','kb','mb','gb','tb','pb'); 13 return @round($size/pow(1024,($unit=floor(log($size,1024)))),2).' '.$units[$unit]; 14 } 15 $cnt = 8566; 16 $r = new SplFixedArray($cnt); 17 //$r = array(); 18 for($i=0;$i<$cnt;$i++) { 19 $r[$i] = rand_str(1024); 20 } 21 echo "\nGENERATING DONE\n"; 22 echo 'peak before serialize() ',convert(memory_get_peak_usage()),PHP_EOL; 23 echo "---\n"; 24 $r = serialize($r); 25 echo 'peak after dumping ',convert(memory_get_peak_usage()),PHP_EOL; 26 unset($r); Expected result: ---------------- GENERATING DONE peak before serialize() 10.19 mb --- peak after dumping 20.96 mb Actual result: -------------- GENERATING DONE peak before serialize() 10.19 mb --- Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8913127 bytes) in /home/flav/softpedia/bigarray-bugreport.php on line 24 ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=51155&edit=1