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