Bug #77308 [Opn]: Unbuffered queries memory leak
Edit report at https://bugs.php.net/bug.php?id=77308&edit=1
ID: 77308
Updated by: nikic@php.net
Reported by: sjon at hortensius dot net
Summary: Unbuffered queries memory leak
Status: Open
Type: Bug
Package: MySQL related
Operating System: archlinux
PHP Version: 7.3.0
Block user comment: N
Private report: N
New Comment:
Test script including (slow) table generation:
<?php
ini_set('memory_limit', '8M');
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'php-test',
'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$pdo->exec("DROP TABLE IF EXISTS large_table");
$pdo->exec("CREATE TABLE large_table (id int)");
for ($j = 0; $j < 100; $j++) {
$query = "INSERT INTO large_table (id) VALUES ";
for ($i = 0; $i < 10000; $i++) {
$query .= "($i), ";
}
$query .= "($i)";
$pdo->exec($query);
}
$result = $pdo->query("SELECT * FROM large_table");
foreach ($result as $i => $row)
if ($i % 10000 === 0)
printf("%10s %10s\n", $i, memory_get_usage());
I'm also getting a
Warning: Packets out of order. Expected 231 received 48. Packet size=3422212 in Unknown on line 0
after the memory limit error.
Previous Comments:
------------------------------------------------------------------------
[2018-12-28 21:06:31] cweiske@php.net
This breaks Roundcube webmail, see https://bugs.archlinux.org/task/61139.
Happens here with 7.3.0-2 (Debian 9)
------------------------------------------------------------------------
[2018-12-17 09:16:01] sjon at hortensius dot net
Description:
------------
commit f1f1f6 broke unbuffered queries in mysqlnd; there is a memory leak causing php to run out of
memory
Test script:
---------------
<?php
ini_set('memory_limit', '8M');
$pdo = new PDO('mysql:host=*;dbname=*', '*', '*');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$result = $pdo->query("SELECT * FROM large_table");
foreach ($result as $i => $row)
if ($i % 10000 === 0)
printf("%10s %10s\n", $i, memory_get_usage());
Expected result:
----------------
reasonable constant memory usage, eg:
0 427648
10000 427936
20000 427968
30000 427968
40000 427936
Actual result:
--------------
0 427296
10000 2000288
20000 3622336
30000 5260736
40000 6915488
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 16384 bytes) in /php
on line 10
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=77308&edit=1
Thread (13 messages)
- sjon at hortensius dot net
- cweiske@php.netBug #77308 [Com]: Unbuffered queries memory leak
- nikic@php.netBug #77308 [Opn]: Unbuffered queries memory leak
- nikic@php.netBug #77308 [Opn]: Unbuffered queries memory leak
- sjon at hortensius dot netBug #77308 [Asn]: Unbuffered queries memory leak
- nikic@php.netBug #77308 [Asn]: Unbuffered queries memory leak
- dmitry@php.netBug #77308 [Asn->Csd]: Unbuffered queries memory leak
- alex at alex-at dot netBug #77308 [Com]: Unbuffered queries memory leak
- nikic@php.netBug #77308 [Csd]: Unbuffered queries memory leak
- alex at alex-at dot netBug #77308 [Com]: Unbuffered queries memory leak
- alex at alex-at dot netBug #77308 [Com]: Unbuffered queries memory leak
- kinimodmeyer at gmail dot comBug #77308 [Com]: Unbuffered queries memory leak
- sjon@php.netBug #77308 [Csd]: Unbuffered queries memory leak