Edit report at https://bugs.php.net/bug.php?id=61060&edit=1
ID: 61060 Updated by: ras...@php.net Reported by: trusty_jim at hotmail dot com Summary: MySQL memory leak -Status: Open +Status: Not a bug Type: Bug Package: MySQL related Operating System: Windows Vista PHP Version: 5.3.10 Block user comment: N Private report: N New Comment: This will depend on your mysql client library, and it isn't actually a memory leak. Running your script on my Ubuntu box gives me: Start Memory : 227784 228240 228240 228240 228240 228240 228240 228240 228240 228240 228240 End Memory : 228120 On both PHP 5.3.11 and PHP 5.4.1 using the old outdated mysql extension built against libmysqlclient-dev-5.1.61-0ubuntu0.11.10.1 Now, if however you are using the mysqlnd library, keep in mind that this library uses PHP native memory management system, so anything allocated by the library shows up in memory_get_usage(). So, using mysqli linked against mysqlnd I get: Start Memory : 235440 9969808 9970720 9971632 9972544 9973456 9974368 9975280 9976192 9977104 9978016 End Memory : 295280 But this makes perfect sense. Each time you fetch a row from the MySQL server the client library needs to allocate memory to store that row. This happens in the non-mysqlnd case as well, but it uses a straight system malloc() call so the memory doesn't show up when you call memory_get_usage(). It is still eating memory, and it isn't actually a leak, that's how the library works. You get your memory back when you free the result. Now, what this bug report is really asking is how do we tell the client library not to buffer rows as we read them from the server. That's what unbuffered queries are all about. In mysqli this see the use_result() method. For the old deprecated mysql extension, see the mysql_unbuffered_query() function. So, this is not actually a bug. Previous Comments: ------------------------------------------------------------------------ [2012-04-10 16:59:23] jim at bladehq dot com I have experienced this issue too. It appears to only leak memory when the query is SELECT *. This has caused our application to run out of memory when iterating over large result sets. ------------------------------------------------------------------------ [2012-02-12 03:50:28] trusty_jim at hotmail dot com Description: ------------ Fetching data through mysql_fetch_assoc() causes php memory usage to go up after each query. This occurs even after unsetting the retrieved data. Test script: --------------- <?php $db = mysql_connect(DB_DOMAIN, DB_USERNAME, DB_PASS, true); echo "Start Memory : ".memory_get_usage()."\n"; $result = mysql_query('SELECT * FROM addr', $db); for ($i = 0; $i < 10; $i++) { $row = mysql_fetch_assoc($result); if ($row === false) break; unset($row); gc_collect_cycles(); echo " ".memory_get_usage()."\n"; } mysql_free_result($result); echo "End Memory : ".memory_get_usage()."\n"; ?> Expected result: ---------------- Memory usage should be similar after each execution Start Memory : 31108008 65407576 65407576 65407576 65407576 65407576 65407576 65407576 65407576 65407576 65407576 End Memory : 31108160 Actual result: -------------- Memory usage increases significantly after each execution Start Memory : 31108008 65407576 65408120 65408664 65409208 65409752 65410296 65410840 65411384 65411944 65412488 End Memory : 31108160 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=61060&edit=1