Okay Andi, the script in this message is as simple as it gets. I used a syslog file to create a load of data in this case, but of course you can use any (text) file for this.
#!/usr/bin/php5 <? function process() { $data = file("/var/log/syslog.0"); foreach ($data as $line) throw new Exception("error"); } for ($i=0; $i < 30; $i++) { echo memory_get_usage()."\n"; try { process(); } catch (Exception $e) { } } ?> This is the output it gives me (PHP 5.0.4 btw): 40232 309528 578880 846720 1114560 1382400 1650240 1918080 2185920 2453760 2721600 2989440 3257280 ... 7810560 I consider this a bug or a flaw anyway. I hope you agree. Ron "Andi Gutmans" <[EMAIL PROTECTED]> schreef in bericht news:[EMAIL PROTECTED] > Can you send a complete script which also passes $data that reproduces the > problem? Thanks. > > At 05:27 PM 8/9/2005 +0200, Ron Korving wrote: > >The problem occurs in this particular situation: > > > >public function process($data) > >{ > > $largeResultSet = $this->xmlParser->parseString($data); > > > > foreach ($largeResultSet as &$item) > > { > > throw new Exception("error"); > > } > >} > > > >It only happens if the exception is thrown from within the foreach(). It > >seems the $largeResultSet is not freed in this case. Using the foreach by > >reference or not (&$item or $item) does not make a difference. > > > >Ron > > > > > >""Ron Korving"" <[EMAIL PROTECTED]> schreef in bericht > >news:[EMAIL PROTECTED] > > > It is very likely that this has something to do with DOM. It's a huge > >piece > > > of code though, making it hard to test where the problem really lies. > > > > > > ""Ron Korving"" <[EMAIL PROTECTED]> schreef in bericht > > > news:[EMAIL PROTECTED] > > > > I've noticed that in a script of mine, memory consumption can explode > > > quite > > > > drastically when Exceptions are thrown, opposed to very normal memory > > > > consumption when exceptions are not thrown. > > > > > > > > This is the idea: > > > > > > > > <? > > > > class Obj > > > > { > > > > function process($i) > > > > { > > > > // do a lot of stuff, occupy a lot of memory within the scope of > >this > > > > function > > > > throw new Exception("error"); > > > > } > > > > } > > > > > > > > $obj = new Obj(); > > > > $errors = array(); > > > > > > > > for ($i=0; $i < 60; $i++) > > > > { > > > > try > > > > { > > > > $obj->process(); > > > > } > > > > catch (Exception $e) > > > > { > > > > $errors[] = $e->getMessage(); > > > > } > > > > } > > > > ?> > > > > > > > > When exceptions are not thrown, memory consumption is normal. The > >method's > > > > local vars are freed and not much more memory is used in the 50th pass > > > > compared to the 1st. But when exceptions are thrown, memory consumption > > > > increases quite a bit every pass. In the end (within the 60 passes of my > > > > loop) over 8 MB's are used. > > > > > > > > Of course, I can unset a lot of data before throwing exceptions to free > >up > > > > memory and the problem will be solved. But it would be nicer if the > > > cleanup > > > > would happen as an exception is thrown. > > > > > > > > Can this be considered a bug or is this behavior known and accepted? > > > > > > > > Ron > > > >-- > >PHP Internals - PHP Runtime Development Mailing List > >To unsubscribe, visit: http://www.php.net/unsub.php -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php