From: tomas at slax dot org
Operating system: Linux
PHP version: 5.5.18
Package: MySQLi related
Bug Type: Bug
Bug description:mysqlnd Memory allocation problem - memory not freed
Description:
------------
When PHP is compiled with mysqlnd (default), it has a problem with
freeing memory, as I will demonstrate in test script. If PHP is compiled
with libmysqlclient, the problem does not occur.
Compiling PHP with mysqlnd causes the test script to work INCORRECTLY:
./configure \
--with-mysql-sock=/var/run/mysql/mysql.sock \
--with-mysql \
--with-mysqli
# note that mysqlnd is enabled by default. It's like:
--with-mysqli=mysqlnd
Compile PHP with libmysqlclient to fix the memory allocation problem:
./configure \
--with-mysql-sock=/var/run/mysql/mysql.sock \
--with-mysql=/usr \
--with-mysqli=/usr/bin/mysql_config \
# note that this fixes the problem
I expect you to fix bug in PHP's mysqlnd driver so it properly free()s
the memory!!
Thank you very much !!!
This error is there since PHP 5.4.x and is there even now with PHP
5.6.x
Test script:
---------------
<?php
echo "First, connect to database test...\n";
$link=mysqli_connect("localhost",'root','rrr','test');
echo "Create temporary table with lots of rows...\n";
$ok=mysqli_query($link,"CREATE TEMPORARY TABLE tbl123 LIKE
mysql.user");
if (!$ok) die();
for ($i=0;$i<6000; $i++)
{
mysqli_query($link,"INSERT IGNORE INTO tbl123 SET
host='x".$i."'");
}
echo "Get all rows from database\n";
$result=mysqli_query($link,"SELECT * FROM tbl123");
while($row=mysqli_fetch_row($result))
{
echo "Mem used:
".number_format(memory_get_usage()/1024,1,'.','')." KB\n";
}
// expected result: memory usage still the same
// libmysqlclient result: memory usage still the same
// mysqlnd result: memory usage increases with each row!! :(
// and if it reaches php memory limit, the script
dies :(
?>
Expected result:
----------------
I expect that PHP doesn't use more than, say, 512KB while processing
6000 rows from database as shown in the example. I expect the test
script to print constant memory usage, as like:
Mem used: 228.7 KB
Mem used: 228.7 KB
Mem used: 228.7 KB
Mem used: 228.7 KB
Mem used: 228.7 KB
Mem used: 228.7 KB
Mem used: 228.7 KB
Mem used: 228.7 KB
Mem used: 228.7 KB
(still the same)
Actual result:
--------------
When using mysqlnd (compiled with mysqlnd by default), it increases
memory usage with every row, this is very bad:
Mem used: 14040.2 KB
Mem used: 14042.1 KB
Mem used: 14044.1 KB
Mem used: 14046.1 KB
Mem used: 14048.0 KB
Mem used: 14050.0 KB
Mem used: 14052.0 KB
Mem used: 14054.0 KB
Mem used: 14055.9 KB
Mem used: 14057.9 KB
Mem used: 14059.9 KB
Mem used: 14061.8 KB
Mem used: 14063.8 KB
Mem used: 14065.8 KB
(still bigger, this is WRONG)
--
Edit bug report at https://bugs.php.net/bug.php?id=68318&edit=1
--
Try a snapshot (PHP 5.4): https://bugs.php.net/fix.php?id=68318&r=trysnapshot54
Try a snapshot (PHP 5.5): https://bugs.php.net/fix.php?id=68318&r=trysnapshot55
Try a snapshot (trunk): https://bugs.php.net/fix.php?id=68318&r=trysnapshottrunk
Fixed in SVN: https://bugs.php.net/fix.php?id=68318&r=fixed
Fixed in release: https://bugs.php.net/fix.php?id=68318&r=alreadyfixed
Need backtrace: https://bugs.php.net/fix.php?id=68318&r=needtrace
Need Reproduce Script: https://bugs.php.net/fix.php?id=68318&r=needscript
Try newer version: https://bugs.php.net/fix.php?id=68318&r=oldversion
Not developer issue: https://bugs.php.net/fix.php?id=68318&r=support
Expected behavior: https://bugs.php.net/fix.php?id=68318&r=notwrong
Not enough info: https://bugs.php.net/fix.php?id=68318&r=notenoughinfo
Submitted twice: https://bugs.php.net/fix.php?id=68318&r=submittedtwice
register_globals: https://bugs.php.net/fix.php?id=68318&r=globals
PHP 4 support discontinued: https://bugs.php.net/fix.php?id=68318&r=php4
Daylight Savings: https://bugs.php.net/fix.php?id=68318&r=dst
IIS Stability: https://bugs.php.net/fix.php?id=68318&r=isapi
Install GNU Sed: https://bugs.php.net/fix.php?id=68318&r=gnused
Floating point limitations: https://bugs.php.net/fix.php?id=68318&r=float
No Zend Extensions: https://bugs.php.net/fix.php?id=68318&r=nozend
MySQL Configuration Error: https://bugs.php.net/fix.php?id=68318&r=mysqlcfg