Bug #54864 [Com]: Memory leak associated with mysql connector
| From: | jas at rephunter dot net | Date: | Thu, 10 Sep 2015 13:51:57 +0000 |
| Subject: | Bug #54864 [Com]: Memory leak associated with mysql connector | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-195943@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=54864&edit=1
ID: 54864
Comment by: jas at rephunter dot net
Reported by: jas at rephunter dot net
Summary: Memory leak associated with mysql connector
Status: Re-Opened
Type: Bug
Package: MySQLi related
Operating System: FreeBSD
PHP Version: 5.3.6
Block user comment: N
Private report: N
New Comment:
The problem seems to be worse than previously. The following results are on PHP 5.5.27.
On every loop while reading a table, memory is consumed, regardless of using gc_enable, unset, or
mysqli_free_memory.
I started by dusting off the script that I originally provided in this bug ticket on 2011-07-05.
However that complexity is not needed, and a very simple query of "SELECT * from user"
gives the same result.
Here is the main loop of the simplified version, where the user table has about 70,000 rows:
$rs = mysqli_query($link, 'SELECT * FROM user');
if ($rs)
{
// main loop
$cnt = 0;
echo 'after SQL mem=', memory_get_usage(true), LF;
while($row = mysqli_fetch_row($rs))
{
if (++$cnt % 3000 == 0)
{
echo ' id=', $row[$userid_ix], ' mem=', memory_get_usage(true), LF;
gc_collect_cycles();
flush();
ob_flush(); // documentation is inconclusive whether this is also needed
}
unset($row);
// $row = null;
}
}
Here is the output of the above script (please note that the echo statements are issued once for
every 3000 rows):
Test Autoemail Memory Leak
Using mysqli_connect
start run mem=524288
Query
SELECT * FROM user
after SQL mem=24117248
id=3043 mem=29884416
id=6066 mem=35913728
id=9041 mem=41680896
id=12031 mem=47710208
id=15015 mem=53477376
id=17986 mem=59506688
id=20984 mem=65273856
id=24004 mem=71303168
id=27065 mem=77070336
id=30076 mem=83099648
id=33115 mem=88866816
id=36201 mem=94896128
id=39095 mem=100663296
id=42106 mem=106692608
id=45112 mem=112459776
id=48104 mem=118489088
id=51085 mem=124518400
id=54082 mem=130285568
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in
/Users/jas/Websites/RepHunter/current/test-autoemail-memory.php on line 44
The various attempts to reclaim memory (gc_enable(), unset(), gc_reclaim_cycles, and setting the
$row to null, all have no effect.
At this point, the workaround is to simply set memory large enough, and hope the application
completes before exhausting memory. At present I am using ini_set('memory_limit',
'384M');
The problem (on line 44) is while($row = mysqli_fetch_row($rs)).
Has anybody come up with an alternative to that construct that does not continue to consume memory?
Previous Comments:
------------------------------------------------------------------------
[2015-09-03 17:18:42] jas at rephunter dot net
I am the OP for this ticket. Our system, now at PHP 5.6.9, is once again experiencing a memory leak,
and in fact it is in the same script as in the original post.
I am planning to do some testing to see if unsetting things helps. But per the post from yesterday
from supraguy, that does not work.
------------------------------------------------------------------------
[2015-09-02 20:53:41] supraguy at yandex dot com
I run into the same problem as well. I use mysqli_query() and on each execution it increases by 50
or so bytes. I unset the crap out of everything and do mysqli_free_result() but still the number
keeps rising.
------------------------------------------------------------------------
[2015-05-17 19:26:24] pr0ger at free dot fr
Note : same leakage using mysql_fetch_row() or mysql_fetch_array()
------------------------------------------------------------------------
[2015-05-17 19:22:00] pr0ger at free dot fr
Reproduced the memory leakage in php 5.5.0 + win7
had to fetch through 10M lines of TINYTEXT string (randoms from 4 to 250 utf8 chars)
$pt = mysql_query("SELECT tinytext_data, int_primkey FROM buffer");
while ($line = mysql_fetch_array($pt))
{
//doesnt need to do anything
echo "\r\n". memory_get_usage();
}
at each step, it increase the mem usage by 64 bytes, never freeing them.
------------------------------------------------------------------------
[2013-02-18 00:34:51] php-bugs at lists dot php dot net
No feedback was provided. The bug is being suspended because
we assume that you are no longer experiencing the problem.
If this is not the case and you are able to provide the
information that was requested earlier, please do so and
change the status of the bug back to "Open". Thank you.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=54864
--
Edit this bug report at https://bugs.php.net/bug.php?id=54864&edit=1