From: thomas dot koenig at web-eci dot com Operating system: Debian Wheezy x64 PHP version: 5.4.20 Package: opcache Bug Type: Bug Bug description:Memory leak with opCache, XML and continue
Description: ------------ Hello, everybody. I noticed a problem while parsing XML with interlocked foreach loops : if I write 'continue 2' to continue the upper loop, this will consume virtual memory far faster than with a single 'continue' or 'break'. In my exemple, I parse a small basic XML; when I use 'continue 2', I see that as much as 8MB are used for this tiny loop. (See actual result) On the other hand, only around 256kB are used if I replace this 'continue 2' with 'break 2' (See expected result). As you can see, this 'continue 2' leads the script to retain much more memory than needed, and that this virtual memory is retained even if the loops allocating this memory are finished. Furthermore, we used the 'continue 2' version on a server when parsing a 37MB XML file, and this leaded the script to fail because the OS prevented it to claim more than 2GB of virtual memory; as you can see, this isn't only a theoritical issue. Awaiting a bugfix, Regards. Test script: --------------- function testOpCache(){ $tab1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); $tab2 = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'); $tab3 = array(1 => 'a', 2 => 'b', 3 => 'c', 4 => 'd', 5 => 'e', 6 => 'f', 7 => 'g', 8 => 'h', 9 => 'i', 10 => 'j'); $xml = " <level1> <level2>info1</level2> <level2>info2</level2> <level2>info3</level2> <level2>info4</level2> <level2>info5</level2> <level2> <level3>subinfo1</level3> <level3>subinfo2</level3> <level3>subinfo3</level3> <level3>subinfo4</level3> <level3> <level4>subsubinfo1</level4> <level4>subsubinfo2</level4> <level4>subsubinfo3</level4> <level4>subsubinfo4</level4> </level3> <level3> <level4>subsubinfo1</level4> <level4>subsubinfo2</level4> <level4>subsubinfo3</level4> <level4>subsubinfo4</level4> </level3> <level3> <level4> <level5>aaa</level5> <level5>aaa</level5> <level5>aaa</level5> <level5>aaa</level5> <level5>aaa</level5> </level4> <level4>subsubinfo2</level4> <level4> <level5>aaa</level5> <level5>aaa</level5> <level5>aaa</level5> <level5>aaa</level5> <level5>aaa</level5> </level4> <level4>subsubinfo4</level4> </level3> </level2> <level2> <level3>subinfo1</level3> <level3>subinfo2</level3> <level3>subinfo3</level3> <level3>subinfo4</level3> <level3> <level4>subsubinfo1</level4> <level4>subsubinfo2</level4> <level4>subsubinfo3</level4> <level4>subsubinfo4</level4> </level3> <level3> <level4>subsubinfo1</level4> <level4>subsubinfo2</level4> <level4>subsubinfo3</level4> <level4>subsubinfo4</level4> </level3> <level3> <level4> <level5>aaa</level5> <level5>aaa</level5> <level5>aaa</level5> <level5>aaa</level5> <level5>aaa</level5> </level4> <level4>subsubinfo2</level4> <level4>subsubinfo3</level4> <level4> <level5>aaa</level5> <level5>aaa</level5> <level5>aaa</level5> <level5>aaa</level5> <level5>aaa</level5> </level4> </level3> </level2> </level1> "; $dom = simplexml_load_string($xml); $tab4 = array(); sm(); foreach($tab1 as $t1){ foreach($tab2 as $t2){ foreach($tab3 as $t3){ foreach($dom->xpath('/level1/level2') as $level2){ foreach($level2->xpath('level3') as $level3){ foreach($level3->xpath('level4') as $level4){ foreach($level4->xpath('level5') as $level5){ continue 2; //break 2; } } } } } } } sm(); } function sm(){ echo memory_get_usage()."\n"; } testOpCache(); Expected result: ---------------- thomas@Koenig:~$ php /home/thomas/Desktop/tests/opcache-1.php 239224 240120 thomas@Koenig:~$ Actual result: -------------- thomas@Koenig:~$ php /home/thomas/Desktop/tests/opcache-1.php 239200 8416616 thomas@Koenig:~$ -- Edit bug report at https://bugs.php.net/bug.php?id=65743&edit=1 -- Try a snapshot (PHP 5.4): https://bugs.php.net/fix.php?id=65743&r=trysnapshot54 Try a snapshot (PHP 5.3): https://bugs.php.net/fix.php?id=65743&r=trysnapshot53 Try a snapshot (trunk): https://bugs.php.net/fix.php?id=65743&r=trysnapshottrunk Fixed in SVN: https://bugs.php.net/fix.php?id=65743&r=fixed Fixed in release: https://bugs.php.net/fix.php?id=65743&r=alreadyfixed Need backtrace: https://bugs.php.net/fix.php?id=65743&r=needtrace Need Reproduce Script: https://bugs.php.net/fix.php?id=65743&r=needscript Try newer version: https://bugs.php.net/fix.php?id=65743&r=oldversion Not developer issue: https://bugs.php.net/fix.php?id=65743&r=support Expected behavior: https://bugs.php.net/fix.php?id=65743&r=notwrong Not enough info: https://bugs.php.net/fix.php?id=65743&r=notenoughinfo Submitted twice: https://bugs.php.net/fix.php?id=65743&r=submittedtwice register_globals: https://bugs.php.net/fix.php?id=65743&r=globals PHP 4 support discontinued: https://bugs.php.net/fix.php?id=65743&r=php4 Daylight Savings: https://bugs.php.net/fix.php?id=65743&r=dst IIS Stability: https://bugs.php.net/fix.php?id=65743&r=isapi Install GNU Sed: https://bugs.php.net/fix.php?id=65743&r=gnused Floating point limitations: https://bugs.php.net/fix.php?id=65743&r=float No Zend Extensions: https://bugs.php.net/fix.php?id=65743&r=nozend MySQL Configuration Error: https://bugs.php.net/fix.php?id=65743&r=mysqlcfg