Re: Where's my memory going?!

From: Date: Tue, 29 Sep 2009 23:15:04 +0000
Subject: Re: Where's my memory going?!
References: 1 2 3 4 5 6 7 8  Groups: php.general 
Request: Send a blank email to php-general+get-298409@lists.php.net to get a copy of this message
On Tue, Sep 29, 2009 at 6:51 PM, Jim Lucas <lists@cmsws.com> wrote: > Philip Thompson wrote: >> On Sep 29, 2009, at 4:38 PM, Jim Lucas wrote: >> >>> Philip Thompson wrote: >>>> On Sep 28, 2009, at 4:40 PM, jeff brown wrote: >>>> >>>>> Yes, that's the best way to clean up after yourself.  And you really >>>>> should use that on anything you have sitting around daemon like. >>>>> >>>>> Jeff >>>>> >>>>> Philip Thompson wrote: >>>>>> On Sep 28, 2009, at 4:27 PM, Ralph Deffke wrote: >>>>>>> well this sound clearly to me like you are not freeing resultsets >>>>>>> you are not going to use anymore. In long scripts you have to take >>>>>>> care of this. on short scripts you can be a bit weak on that, >>>>>>> because the resultsets are closed and freed on script ending. >>>>>>> >>>>>>> assumed u r using MySQL are u using mysql_free_result($result) >>>>>>> >>>>>>> goog luck >>>>>>> >>>>>>> ralph_deffke@yahoo.de >>>>>>> >>>>>>> >>>>>>> "Philip Thompson" <philthathril@gmail.com> wrote in >>>>>>> message >>>>>>> >>>>>>> news:9C0B9C4C-5E64-4519-862B-8A3E1DA4DE4C@gmail.com... >>>>>>>> Hi all. >>>>>>>> >>>>>>>> I have a script that opens a socket, creates a persistent mysql >>>>>>>> connection, and loops to receive data. When the amount of specified >>>>>>>> data has been received, it calls a class which processes the data >>>>>>>> and >>>>>>>> inserts it into the database. Each iteration, I unset/destruct that >>>>>>>> class I call. However, the script keeps going up in memory and >>>>>>>> eventually runs out, causing a fatal error. Any thoughts on where >>>>>>>> to >>>>>>>> start to see where I'm losing my memory? >>>>>>>> >>>>>>>> Thanks in advance, >>>>>>>> ~Philip >>>>>> I am not using mysql_free_result(). Is that highly recommended by all? >>>>>> Thanks, >>>>>> ~Philip >>>> >>>> I took your suggestions and made sure to clean up after myself. I'm >>>> running into something that *appears* to be a bug with >>>> mysql_free_result(). Here's a snippet of my db class. >>>> >>>> <?php >>>> class db { >>>>    function fetch ($sql, $assoc=false) >>>>    { >>>>        echo "\nMemory usage before query: " . number_format >>>> (memory_get_usage ()) . "\n"; >>>>        $resultSet = $this->query($sql); >>>>        echo "Memory usage after  query: " . number_format >>>> (memory_get_usage ()) . "\n"; >>>> >>>>        if (!$assoc) { $result = $this->fetch_row($resultSet); } >>>>        else { >>>>            $result = $this->fetch_array($resultSet); >>>>            echo "Memory usage after  fetch: " . number_format >>>> (memory_get_usage ()) . "\n"; >>>>        } >>>> >>>>        $this->freeResult($resultSet); >>>>        echo "Memory usage after   free: " . number_format >>>> (memory_get_usage ()) . "\n"; >>>> >>>>        return $result; >>>>    } >>>> >>>>    function freeResult ($result) >>>>    { >>>>        if (is_resource ($result)) { >>>>            if (!mysql_free_result ($result)) { echo "Memory could not >>>> be freed\n"; } >>>>        } >>>>        unset ($result); // For good measure >>>>    } >>>> >>>>    function fetch_row ($set) { >>>>        return mysql_fetch_row ($set); >>>>    } >>>> >>>>    function fetch_array ($set) { >>>>        return mysql_fetch_array ($set, MYSQL_ASSOC); >>>>    } >>>> } >>>> >>>> // I seem to be losing memory when I call this >>>> $db->fetch($sql); >>>> ?> >>>> >>>> The result I get with this is... >>>> >>>> Memory usage before query: 6,406,548 >>>> Memory usage after  query: 6,406,548 >>>> Memory usage after  fetch: 6,406,548 >>>> Memory usage after   free: 6,406,572 >>>> >>>> As you may notice, the memory actually goes UP after the *freeing* of >>>> memory. Why is this happening?! What have I done wrong? Is this a bug? >>>> Any thoughts would be appreciated. >>>> >>> >>> First off, my question would be, is your query actually working? >>> Because I >>> would imagine that if you were getting results back from the DB, that >>> the amount >>> of memory being used would increase between step 1 & 2. >>> >>> Check to make sure that you are getting results. >> >> I'm confident the queries are working (there's many of them and I know >> the data they're returning is correct), but they may not always be >> returning results. The memory value does change in some instances... >> >> Memory usage before query: 5,138,372 >> Memory usage after  query: 5,138,396 >> Memory usage after   free: 5,138,556 >> >> This was one that use fetch_row() instead of fetch_array(), but the same >> difference. I did some searching around and I think it's a bug in PHP >> and/or Zend Memory Management engine. As I mentioned in a previous post >> about mysql_query() not allocating memory appropriately, I believe this >> could quite possibly be the case. Several people have reported bugs >> similar to this... unfortunately, they are marked as (erroneously?) >> bogus or said it has been fixed (when, IMO, it has not). >> >> http://bugs.php.net/bug.php?id=40883 >> http://bugs.php.net/bug.php?id=28424 >> http://bugs.php.net/bug.php?id=41871 >> >> I'm using version 5.2.6 on Fedora 8 and the bug still appears to be >> there. I think I'm going to take a different approach to fix this. I'll >> create a shell script to loop and invoke the socket listener script, and >> when it gathers data, call the import script. This way, the php >> script(s) will end execution after each iteration and release the >> memory. Is this reasonable? >> >> This has been a long day. Thanks for your input. Any more thoughts are >> welcome. >> >> ~Philip >> > > Doesn't PHP only give back a "pointer" back from MySQL when it runs a query? > Then what PHP does is uses that "pointer" to mysql to request the next row of > results? > > Couldn't you use the unbuffered-query function for this? > > http://php.net/mysql-unbuffered-query > > Maybe this will help? > > > -- > PHP General Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > > What version of PHP (older versions like to leak memory, if MY memory serves me right, haha)? Have you tried running with 5.3.0 and using the garbage collection?

« previous php.general (#298409) next »