Edit report at https://bugs.php.net/bug.php?id=62111&edit=1
ID: 62111 Updated by: u...@php.net Reported by: hosiplan at gmail dot com Summary: MySQL PDO memory leaks, when used own result row class Status: Open Type: Bug Package: PDO related Operating System: Linux PHP Version: 5.4.4RC1 Block user comment: N Private report: N New Comment: It matters a whole lot what the cause is. It is not a leak. First, it helps to have some clean test code, such as this: class pdo_row { public function __construct($stmt) { $stmt = NULL; } } /* $pdo = new PDO("mysql:dbname=test;unix_socket=/var/run/mysql/mysql.sock", "root", ""); */ $pdo = new PDO("sqlite::memory:"); $pdo->exec("DROP TABLE test"); $pdo->exec("CREATE TABLE test(id INT, col VARCHAR(200))"); for ($i = 0; $i < 100; $i++) { $pdo->exec(sprintf("INSERT INTO test(id, col) VALUES (1, '012345678901234567890123456789012345678901234567890123456789-%d')", $i)); } for ($i = 0; $i < 10; $i++) { $stmt = $pdo->prepare("SELECT col FROM test"); $stmt->execute(); $stmt->setFetchMode(PDO::FETCH_CLASS, 'pdo_row', array($stmt)); $rows = $stmt->fetchAll(); printf("emalloc %d kB, malloc %d kB\n", memory_get_usage() / 1024, memory_get_usage(true) / 1024); } Running the above for SQLlite gives me: emalloc 205 kB, malloc 256 kB emalloc 206 kB, malloc 512 kB emalloc 207 kB, malloc 512 kB emalloc 208 kB, malloc 512 kB emalloc 209 kB, malloc 512 kB emalloc 210 kB, malloc 512 kB emalloc 211 kB, malloc 512 kB emalloc 212 kB, malloc 512 kB emalloc 213 kB, malloc 512 kB emalloc 214 kB, malloc 512 kB Running the above for MySQL gives me: emalloc 221 kB, malloc 256 kB emalloc 231 kB, malloc 512 kB emalloc 240 kB, malloc 512 kB emalloc 250 kB, malloc 512 kB emalloc 259 kB, malloc 512 kB emalloc 269 kB, malloc 512 kB emalloc 278 kB, malloc 512 kB emalloc 288 kB, malloc 512 kB emalloc 297 kB, malloc 512 kB emalloc 307 kB, malloc 512 kB Second, it helps to understand the matter. In both cases emalloc() figures increase, which is to be expected. PHP objects are created, the extensions allocate memory using the PHP internal e*alloc() function family and the figures increase. And, in both cases malloc() figures are the same. No difference between MySQL and SQLite. Previous Comments: ------------------------------------------------------------------------ [2012-06-12 16:18:47] hosiplan at gmail dot com I don't really care what you name it. It's a real problem and its eating my memory and it shouldn't! ------------------------------------------------------------------------ [2012-06-12 13:33:16] u...@php.net There is no leak with MySQL. Memory usage increases, that's it. ==6216== LEAK SUMMARY: ==6216== definitely lost: 0 bytes in 0 blocks ==6216== indirectly lost: 0 bytes in 0 blocks ==6216== possibly lost: 0 bytes in 0 blocks ==6216== still reachable: 54 bytes in 2 blocks ==6216== suppressed: 0 bytes in 0 blocks ==6216== Rerun with --leak-check=full to see details of leaked memory ------------------------------------------------------------------------ [2012-06-11 13:48:11] juzna dot cz at gmail dot com The same causes PHP to crash completely on Windows 32bit with MSSQL server (using sqlsrv driver). I guess the root cause will be related. ------------------------------------------------------------------------ [2012-05-22 20:39:55] juzna dot cz at gmail dot com Leaks with mysql, no leaks with sqlite. No need to fetchAll(); execute() is enough to get leaks ------------------------------------------------------------------------ [2012-05-22 20:12:17] hosiplan at gmail dot com affected version ------------------------------------------------------------------------ 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=62111 -- Edit this bug report at https://bugs.php.net/bug.php?id=62111&edit=1