Bug #52959 [Opn->Csd]: PDO_MYSQL: Memory leak when unsetting PDOStatement and/or resultset
| From: | nikic@php.net | Date: | Wed, 28 Oct 2020 15:28:44 +0000 |
| Subject: | Bug #52959 [Opn->Csd]: PDO_MYSQL: Memory leak when unsetting PDOStatement and/or resultset | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-229988@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=52959&edit=1
ID: 52959
Updated by: nikic@php.net
Reported by: eddawley at gmail dot com
Summary: PDO_MYSQL: Memory leak when unsetting PDOStatement
and/or resultset
-Status: Open
+Status: Closed
Type: Bug
Package: PDO MySQL
Operating System: Centos 5
PHP Version: 5.3.3
-Assigned To:
+Assigned To: nikic
Block user comment: N
Private report: N
New Comment:
Can't reproduce this with any combination of unsets commented or not. Presumably this has been
fixed since this issue was reported ten years ago...
Previous Comments:
------------------------------------------------------------------------
[2010-09-29 23:45:06] eddawley at gmail dot com
Description:
------------
I am noticing unexpected, inconsistent memory use when unsetting the resultset
of a PDOStatement and/or unsetting the statement itself.
I have attached a quick test script to illustrate the problematic behavior. I
am selecting approximately 500k rows in order to make the memory usage obvious.
The script should be run with all of the unsets commented out and then with some
or all uncommented.
Run with:
no unsets: system memory usage fluctuates but relatively stable, peak memory
usage increases
uncommenting some or all of the unsets: system and peak usage will continually
increase
I understand how the memory usage could fluctuate due to garbage collection but
I do not understand why the addition of unsets would cause a steady increase in
memory usage. This appears to be a memory leak.
Also, top/ps output for RSS/VSZ of the process matches the "peak" memory usage
and not the system allocated or php allocated numbers. Is this to be expected?
Test script:
---------------
<?php
$db = connect();
while(1){
echo(memory_get_usage(true) . "\t" . memory_get_usage() . "\t" .
memory_get_peak_usage() . "\n");
blah($db);
}
function blah($db){
$sql = "select id from table LIMIT 500000";
$stmt = $db->prepare($sql);
$stmt->execute();
$a = $stmt->fetchAll();
//unset($a);
$stmt->execute();
$a = $stmt->fetchAll();
//unset($a);
//unset($stmt);
}
function connect(){
$dsn = 'mysql:host=127.0.0.1;dbname=db;port=3306';
$options = array(PDO::ATTR_TIMEOUT => APPLICATION_DB_PDO_TIMEOUT);
$db = new PDO($dsn, 'user', 'pass', $options);
return $db;
}
Expected result:
----------------
Memory usage over time should be relatively stable overall. Peak memory usage
should be lowest when unsetting the first resultset.
Actual result:
--------------
Memory usage continues to increase over time if any of the unsets are uncommented.
Peak memory usage is halved when the first resultset is unset but it continues to
increase over time.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=52959&edit=1