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

Reply via email to