Bug #52487 [Opn->Csd]: PDO::FETCH_INTO leaks memory
| From: | felipe@php.net | Date: | Thu, 29 Jul 2010 23:39:28 +0000 |
| Subject: | Bug #52487 [Opn->Csd]: PDO::FETCH_INTO leaks memory | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-152953@lists.php.net to get a copy of this message | ||
Edit report at http://bugs.php.net/bug.php?id=52487&edit=1
ID: 52487
Updated by: felipe@php.net
Reported by: marques at displague dot com
Summary: PDO::FETCH_INTO leaks memory
-Status: Open
+Status: Closed
Type: Bug
Package: PDO related
PHP Version: 5.3.3
-Assigned To:
+Assigned To: felipe
Block user comment: N
New Comment:
This bug has been fixed in SVN.
Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
Thank you for the report, and for helping us make PHP better.
Previous Comments:
------------------------------------------------------------------------
[2010-07-30 01:38:56] felipe@php.net
Automatic comment from SVN on behalf of felipe
Revision: http://svn.php.net/viewvc/?view=revision&revision=301706
Log: - Fixed bug #52487 (PDO::FETCH_INTO leaks memory)
------------------------------------------------------------------------
[2010-07-29 15:47:03] marques at displague dot com
Description:
------------
When assigning an object to a PDO statement via FETCH_INTO a memory leak
occurs
that can not be corrected through php code. A subsequent FETCH_INTO
with a
different object only furthers the problem. Changing the fetch mode,
unsetting
the statement, closing the cursor, and calling the garbage collection do
not free
the memory either.
This bug exists in 5.2 and 5.3.
Test script:
---------------
<?php
if (! extension_loaded('pdo_sqlite')) {
dl('pdo_sqlite.so');
}
$pdo = new PDO('sqlite::memory:');
echo "Start mem:".memory_get_peak_usage()."\n";
// Simple test
$stmt = $pdo->prepare("select 1 as attr");
for($i=0; $i<100000; $i++) {
$stmt->setFetchMode(PDO::FETCH_INTO, new StdClass);
echo "mem: ".memory_get_usage()."\n";
}
// End - Simple Test
// Alternate test with failed remedies
class test {
public $attr;
public function load($pdo) {
$stmt = $pdo->prepare("select 1 as attr");
//$stmt->setFetchMode(PDO::FETCH_INTO, $this); // This leaks quickly
$stmt->setFetchMode(PDO::FETCH_INTO, new StdClass); // This still
leaks
$stmt->setFetchMode(PDO::FETCH_ASSOC); // You might think this would
fix the leak - no effect
$stmt->closeCursor(); // No effect
unset($stmt); // No effect
}
}
for($i=0; $i<100000; $i++) {
$test = new test;
$test->load($pdo);
if (function_exists('gc_collect_cycles')) {
echo "+gc+ ";
gc_collect_cycles(); // No effect
}
unset($test);
echo "mem: ".memory_get_peak_usage()."\n";
}
Expected result:
----------------
I would expect the peak memory usage to remain consisten on subsequent
iterations.
Actual result:
--------------
The peak memory usage continues to rise until the php memory limit is
hit.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/bug.php?id=52487&edit=1