On Sep 29, 2009, at 6:15 PM, Eddie Drapkin wrote:
On Tue, Sep 29, 2009 at 6:51 PM, Jim Lucas <lists@xxxxxxxxx> 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@xxxxxxxx
"Philip Thompson" <philthathril@xxxxxxxxx> wrote in message
news:9C0B9C4C-5E64-4519-862B-8A3E1DA4DE4C@xxxxxxxxxxxx
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?
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?
5.2.6. I've not looked at 5.3, but I suppose it couldn't hurt to do
some testing. =D Thank you.
~Philip