Bug #81059 [Ana->Dup]: Memory leaks PDO MySQL reading blob field
Edit report at https://bugs.php.net/bug.php?id=81059&edit=1
ID: 81059
Updated by: nikic@php.net
Reported by: andresr dot alz at gmail dot com
Summary: Memory leaks PDO MySQL reading blob field
-Status: Analyzed
+Status: Duplicate
Type: Bug
Package: PDO MySQL
Operating System: Docker FROM php:8.0.6-cli
PHP Version: 8.0.6
Block user comment: N
Private report: N
New Comment:
I've backported the relevant change to PHP-8.0 now. Marking this as a duplicate of bug #80761.
Note that PHP will still use 2x the size of the BLOB peak memory, but this is hard to avoid. At
least it won't use 10x now (depending on the size of BLOB...)
Previous Comments:
------------------------------------------------------------------------
[2021-05-27 13:31:11] nikic@php.net
Okay, I can reproduce the issue now. This is a duplicate of bug #80761, which is fixed in PHP 8.1 by
https://github.com/php/php-src/commit/1fc4c89214c82fabbf997da58051a385d8fe50ab.
We may be able to backport the change.
------------------------------------------------------------------------
[2021-05-27 12:54:59] andresr dot alz at gmail dot com
You can reproduce the problem with a big blob content, maybe > 400mb
The file need to be big to notice the memory leak.
and i am not using a loop, the code waits on : $stm->fetch(PDO::FETCH_BOUND);
It take a lot of time there obviously if the blob is big and you can see how the memory increase a
lot
php: 8.0.6
mysql: 5.1.40
screenshot docker: https://ibb.co/q11mnBG
ps: in my case i tested with a internal company file: 740 mb
------------------------------------------------------------------------
[2021-05-27 08:23:11] nikic@php.net
Could you please provide the schema/contents of the test table you're using here? I tried with
some dummy values, but wasn't able to reproduce a leak.
Also, as you don't have a loop inside the code, I'm assuming that the leak you're
seeing occurs across multiple requests? Each request increasing memory usage?
------------------------------------------------------------------------
[2021-05-20 14:07:09] andresr dot alz at gmail dot com
Description:
------------
#### Dockerfile
FROM php:8.0.6-cli
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-enable pdo_mysql
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
ENTRYPOINT ["php", "testing_pdo.php"]
####
This is not happening with php < 7.3
Test script:
---------------
// testing_pdo.php
<?php
ini_set('memory_limit', '-1');
function _get_connection()
{
print "\nget_connection";
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
);
try {
$dbconn = new PDO(
"mysql:host=" . "localhost",
"user",
"user_test",
$opt
);
$dbconn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
return $dbconn;
} catch (PDOException $e) {
print "Error: $e";
return null;
}
}
function _big_query($dbconn)
{
print "\nbig query running ...";
$CSV_results = "";
$sql = "SELECT sent_blob from test WHERE id = 1";
$stm = $dbconn->prepare($sql);
$stm->execute();
$stm->bindColumn(1, $CSV_results, PDO::PARAM_LOB);
$stm->fetch(PDO::FETCH_BOUND);
$stm->closeCursor();
return $CSV_results;
}
print "\nStarting ....";
$conn = _get_connection();
if ($conn != null) {
$result = _big_query($conn);
print $result;
}
Expected result:
----------------
Memory on docker container keeps almost the same than network IO
Actual result:
--------------
Memory is increasing in a weird way
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=81059&edit=1
Thread (7 messages)