Edit report at http://bugs.php.net/bug.php?id=52487&edit=1

 ID:                 52487
 Updated by:         fel...@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] fel...@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

Reply via email to