From:             
Operating system: FreeBSD
PHP version:      5.3.6
Package:          MySQLi related
Bug Type:         Bug
Bug description:Memory leak associated with mysql connector

Description:
------------
I have found a memory leak in connection with several production PHP
scripts. 

While there are many bug reports relating to memory leaks, I did not find 

anything similar to our situation, which is very easy to reproduce.



The scripts that have been affected by this memory leak have been in
continuous 

production use since 2006. We did not notice a memory leak prior to when we


first upgraded to PHP 5.3.5. It is possible that there was a smaller leak
prior 

to this time that merely escaped notice. However, before reporting the
problem, 

we upgraded to 5.3.6 to make sure it had not been corrected. The results in
this 

ticket are thus for 5.3.6.



Below I have given the main loop of a "small reproducible code." As you can
see, 

the only thing done in this test is to fetch the rows, and print out memory


usage every 3000 rows.



Regarding the mysql connector: originally the test was run with
mysqli_connect. 

It was suggested via Experts-Exchange to try the mysql_connector. This was
done 

but the results were identical. The full script can works with both 

mysql_connect and mysqli_connect, controlled by a define.



The bug signs:



1. On 5.3.6, the "after SQL" memory usage jumps to 13MB, whereas on 5.2.4
it 

stays at the initial low value (262144 on 5.2.4 but 786432 on 5.3.6).



2. On 5.3.6, the memory usage grows dramatically, whereas on 5.2.4 it does
not 

(the "id" lines are displayed after each 3000 rows, where the id is the
primary 

key for the row). In the production scripts, this leads to a crash when the


memory limit is exceeded.



Please note: 



1. the SQL statement is composed of a UNION of 5 relatively simple SELECTs,


making the single statement relatively complex.



2. The expected and actual results shown below are achieved by connecting
to the 

same database.



I you would like the URL of the actual script, which has the connection
routines 

and the SQL (which is relatively complex), please let me know as I would
have to 

remove the passwords, etc. I could also send a mysqldump of a sanitized
version 

of the database. The bzip2 of the dump file is about 35MB.

Test script:
---------------
echo "Test Autoemail Memory Leak\n";

echo 'start run mem=' . memory_get_usage(true) . "\n";

$query = get_query();

$rs = SQL($link, $query);

if ($rs)

{

        // main loop

        $cnt = 0;

        echo 'after SQL mem=' . memory_get_usage(true) . "\n";

        $func = (MYSQL_ENHANCED) ? 'mysqli_fetch_row' : 'mysql_fetch_row';

        while($row = $func($rs))

        {

                if (++$cnt % 3000 == 0)

                {

                        echo '   id=' . $row[1] . '  mem=' . 
memory_get_usage(true) . "\n";

                }

        }

        echo "EOJ\n";

}

else

{

        echo $errmsg;

}





Full script is at http://www.rephunter.net/test-autoemail-memory.php. The
web server will execute the script if accessed in a browser.

Expected result:
----------------
Showing no leak on Windows VM PHP 5.2.4 connecting to same database



F:\Websites\RepHunter\current>php -v

PHP 5.2.4 (cli) (built: Oct  1 2007 20:06:42)

Copyright (c) 1997-2007 The PHP Group

Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies

    with Zend Core v2.5.0, Copyright (c) 1998-2006, by Zend Technologies

    with Zend Extension Manager v1.2.0, Copyright (c) 2003-2006, by Zend
Technol

ogies

    with Zend Optimizer v3.3.1, Copyright (c) 1998-2007, by Zend
Technologies

    with Zend Debugger v5.2.10, Copyright (c) 1999-2007, by Zend
Technologies



F:\Websites\RepHunter\current>php test-autoemail-memory.php

Test Autoemail Memory Leak

Using mysqli_connect

start run mem=262144

after SQL mem=262144

   id=43655  mem=262144

   id=40250  mem=262144

   id=37355  mem=262144

   id=34419  mem=262144

   id=31544  mem=262144

   id=28915  mem=262144

   id=26168  mem=262144

   id=21461  mem=262144

   id=16550  mem=262144

   id=13074  mem=262144

   id=9140  mem=262144

   id=3892  mem=262144

EOJ



F:\Websites\RepHunter\current>



Actual result:
--------------
Showing the leak on 5.3.6



[jas1@www /var/www/rephunter/www/webroot]$ php -v

PHP 5.3.6 with Suhosin-Patch (cli) (built: May 13 2011 21:58:30) 

Copyright (c) 1997-2011 The PHP Group

Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies



[jas1@www /var/www/rephunter/www/webroot]$ php ./test-autoemail-memory.php


Test Autoemail Memory Leak

Using mysqli_connect

start run mem=786432

after SQL mem=13631488

   id=43655  mem=23592960

   id=40250  mem=33292288

   id=37355  mem=43253760

   id=34419  mem=52953088

   id=31544  mem=62914560

   id=28915  mem=72613888

   id=26168  mem=82575360

   id=21461  mem=92274688

   id=16550  mem=102236160

   id=13074  mem=112197632

   id=9140  mem=121896960

   id=3892  mem=131858432

EOJ

[jas1@www /var/www/rephunter/www/webroot]$ 



-- 
Edit bug report at http://bugs.php.net/bug.php?id=54864&edit=1
-- 
Try a snapshot (PHP 5.2):            
http://bugs.php.net/fix.php?id=54864&r=trysnapshot52
Try a snapshot (PHP 5.3):            
http://bugs.php.net/fix.php?id=54864&r=trysnapshot53
Try a snapshot (trunk):              
http://bugs.php.net/fix.php?id=54864&r=trysnapshottrunk
Fixed in SVN:                        
http://bugs.php.net/fix.php?id=54864&r=fixed
Fixed in SVN and need be documented: 
http://bugs.php.net/fix.php?id=54864&r=needdocs
Fixed in release:                    
http://bugs.php.net/fix.php?id=54864&r=alreadyfixed
Need backtrace:                      
http://bugs.php.net/fix.php?id=54864&r=needtrace
Need Reproduce Script:               
http://bugs.php.net/fix.php?id=54864&r=needscript
Try newer version:                   
http://bugs.php.net/fix.php?id=54864&r=oldversion
Not developer issue:                 
http://bugs.php.net/fix.php?id=54864&r=support
Expected behavior:                   
http://bugs.php.net/fix.php?id=54864&r=notwrong
Not enough info:                     
http://bugs.php.net/fix.php?id=54864&r=notenoughinfo
Submitted twice:                     
http://bugs.php.net/fix.php?id=54864&r=submittedtwice
register_globals:                    
http://bugs.php.net/fix.php?id=54864&r=globals
PHP 4 support discontinued:          http://bugs.php.net/fix.php?id=54864&r=php4
Daylight Savings:                    http://bugs.php.net/fix.php?id=54864&r=dst
IIS Stability:                       
http://bugs.php.net/fix.php?id=54864&r=isapi
Install GNU Sed:                     
http://bugs.php.net/fix.php?id=54864&r=gnused
Floating point limitations:          
http://bugs.php.net/fix.php?id=54864&r=float
No Zend Extensions:                  
http://bugs.php.net/fix.php?id=54864&r=nozend
MySQL Configuration Error:           
http://bugs.php.net/fix.php?id=54864&r=mysqlcfg

Reply via email to