ID:               28424
 Comment by:       jrose at lgb-inc dot com
 Reported By:      technik at perlentaucher dot de
 Status:           Bogus
 Bug Type:         MSSQL related
 Operating System: Linux
 PHP Version:      5CVS-2004-05-17 (dev)
 New Comment:

If this were just a caching problem with MySQL, wouldn't the memory
usage show up in MySQL, not inside PHP?

I'm facing the same issue in a database conversion program that has to
convert 121,000 records at a time. DB_Result::free() and
mysql_free_result() both appear to do nothing at all. Here's my test
program (does both PEAR and mysql_ calls) and the results I'm getting
with PHP 4.3.2, MySQL 4.0.18, on Redhat Enterprise 3:

<?php
 
define( PEAR, 0 );
 
if ( PEAR )
        require('DB.php');
 
echo "Starting off, we have ", memory_get_usage(), " bytes in use.\n";
 
if ( PEAR )
        $db404 = DB::connect('mysql://cmh:[EMAIL PROTECTED]/amis404');
else    {
        $m = mysql_connect( 'localhost', 'user', 'password' );
        mysql_select_db( 'database' );
        }
 
echo "After connecting, we have ", memory_get_usage(), " bytes in
use.\n";
 
for( $i = 0; $i < 10; $i++ )
        {
        if ( PEAR )
                $q = $db404->query("select * from really_wide_table
limit 30;");
        else    $q = mysql_query("select * from really_wide_table limit
30;");
 
        echo "After query $i, we have ", memory_get_usage(), " bytes in
use.\n";
 
        if ( PEAR )
                {
                $q->free();
                unset( $q );
                }
        else    {
                mysql_free_result( $q );
                unset( $q );
                }
 
        echo "After freeing on iteration $i, we have ",
memory_get_usage(), " bytes in use.\n";
        }
 
if ( PEAR )
        $db404->disconnect();
else    mysql_close( $m );
 
echo "After disconnecting, we have ", memory_get_usage(), " bytes.\n";
 
?>

And the output, first without PEAR:

bash-2.05b$ php /tmp/test.php
Content-type: text/html
X-Powered-By: PHP/4.3.2
 
Starting off, we have 36024 bytes in use.
After connecting, we have 36760 bytes in use.
After query 0, we have 36896 bytes in use.
After freeing on iteration 0, we have 36928 bytes in use.
After query 1, we have 36952 bytes in use.
After freeing on iteration 1, we have 36992 bytes in use.
After query 2, we have 37016 bytes in use.
After freeing on iteration 2, we have 37056 bytes in use.
After query 3, we have 37080 bytes in use.
After freeing on iteration 3, we have 37120 bytes in use.
After query 4, we have 37144 bytes in use.
After freeing on iteration 4, we have 37184 bytes in use.
After query 5, we have 37208 bytes in use.
After freeing on iteration 5, we have 37248 bytes in use.
After query 6, we have 37272 bytes in use.
After freeing on iteration 6, we have 37312 bytes in use.
After query 7, we have 37336 bytes in use.
After freeing on iteration 7, we have 37376 bytes in use.
After query 8, we have 37400 bytes in use.
After freeing on iteration 8, we have 37440 bytes in use.
After query 9, we have 37464 bytes in use.
After freeing on iteration 9, we have 37504 bytes in use.
After disconnecting, we have 37000 bytes.

Then, with PEAR:

bash-2.05b$ php /tmp/test.php
Content-type: text/html
X-Powered-By: PHP/4.3.2
 
Starting off, we have 227840 bytes in use.
After connecting, we have 497872 bytes in use.
After query 0, we have 499088 bytes in use.
After freeing on iteration 0, we have 499120 bytes in use.
After query 1, we have 499216 bytes in use.
After freeing on iteration 1, we have 499248 bytes in use.
After query 2, we have 499344 bytes in use.
After freeing on iteration 2, we have 499376 bytes in use.
After query 3, we have 499472 bytes in use.
After freeing on iteration 3, we have 499512 bytes in use.
After query 4, we have 499616 bytes in use.
After freeing on iteration 4, we have 499656 bytes in use.
After query 5, we have 499760 bytes in use.
After freeing on iteration 5, we have 499800 bytes in use.
After query 6, we have 499904 bytes in use.
After freeing on iteration 6, we have 499944 bytes in use.
After query 7, we have 500048 bytes in use.
After freeing on iteration 7, we have 500088 bytes in use.
After query 8, we have 500224 bytes in use.
After freeing on iteration 8, we have 500264 bytes in use.
After query 9, we have 500368 bytes in use.
After freeing on iteration 9, we have 500408 bytes in use.
After disconnecting, we have 499904 bytes.


Previous Comments:
------------------------------------------------------------------------

[2004-05-18 00:47:25] technik at perlentaucher dot de

MIGHT BE A MYSQL CONFIG ISSUE ?!?!?

While testing i discovered that it seems to stop 
at end of memory without using swap. could be a cache-feature ???

I changed status of this Bug to Bogus until I'm sure that's really a
Bug.

greetings,
 Adam

------------------------------------------------------------------------

[2004-05-17 21:45:25] technik at perlentaucher dot de

Description:
------------
Hi all,

mysql_result seems to leak memory as I Commented 
in Bug #27758. I thought it's worth a new Bugreport.

I tried to find out more about it, so i wrote a 
Script that reads in Data from my DB and calculates
Memory usage in a loop.

The Table looks like that :

28000 identical Records 

ID   : int11, auto_increment
DATA : varchar(20) = 'ABCDEFGHIJKLMNOPQRTS'

The Script reads all Records 300 Times 
before calculating memory usage. 

The Result looks like that : (mem in kb)

Index   Used    Free    Dif
Start   176512  1326208 0
loop 1  176704  1326016 192
loop 2  176776  1325944 72
loop 3  176816  1325904 40
loop 4  176876  1325844 60
loop 5  177028  1325692 152
loop 6  177164  1325556 136
loop 7  177316  1325404 152
loop 8  177492  1325228 176
loop 9  177716  1325004 224
Absolute dif    1204


So usage of Memory is not same in every Loop !!
But at the end I miss about 1.2M of my Memory.

I also could not free this memory by killing 
httpd (killing mysqld also didn't help)

I'm using gentoo, kernel is 2.4.20-gentoo-r7.
Apache : 2.0.48
PHP5   : php5-200405131230 (cvs snap)


Greetings,
 Adam Cwientzek




Reproduce code:
---------------
 for ( $x=0; $x<300; $x++ ) {
    $db = mysql_connect("localhost", "root", "test");
    mysql_select_db("test");
    $sql  = "select data from test"; 
    $result = mysql_query($sql); // causes MEM-Leak !!!!
    mysql_free_result($result);
    mysql_close($db);
 }




------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=28424&edit=1

Reply via email to