ID: 32013
User updated by: mhe at ltcgroup dot de
Reported By: mhe at ltcgroup dot de
-Status: Feedback
+Status: Open
Bug Type: MySQLi related
Operating System: Debian Woody
PHP Version: 5.0.3
Assigned To: georg
New Comment:
i wasnt able to test this under debian woody, but i downloaded the
windows latest snapshot.
now the memory limit is reached using fetch(),
I added a "normal" query, so that you see, that the select using mysqli
is possible on mediumtext,
::
$query = "
select
DESCRIPTION,
DESCRIPTION AS DD
from
tt
order by ID_ITEM
";
echo "init " . getMemUsage() . "\n";
$result = $db->query($query);
echo "query " . getMemUsage() . "\n";
while($row = $result->fetch_assoc())
{
echo " fetch " . getMemUsage() . "\n";
}
$stmt = $db->prepare($query);
echo "prepare " . getMemUsage() . "\n";
$stmt->execute();
echo " exec " . getMemUsage() . "\n";
$stmt->bind_result($DESCRIPTION, $DD);
echo " bind " . getMemUsage() . "\n";
$stmt->fetch();
echo " fetch " . getMemUsage() . "\n";
$stmt->fetch();
echo " fetch " . getMemUsage() . "\n";
::
using function getMemUsage() from http://php.net/memory_get_usage
these are the results:
debain woody 5.0.3:
init 48744
query 48864
fetch 49120
fetch 49296
prepare 49392
exec 49392
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to
allocate 16777216 bytes) in /root/mysqli_prepared.php on line 73
Allowed memory size of 8388608 bytes exhausted (tried to allocate 256
bytes)
line 73 ~ bind_result(), this is how 5.0.3 currently works,
::
these are the results, using version "latest win32:
(increased memory limit, for testing)
init 7.772 K
query 7.812 K
fetch 7.812 K
fetch 7.812 K
prepare 7.824 K
exec 7.832 K
bind 7.844 K
fetch 40.672 K
fetch 40.672 K
you can see, that the memory usage explode after the first fetch(),
bin_result() seems to work.
::
there were 2 items in database,
DROP TABLE tt;
CREATE TABLE tt (
ID_ITEM INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
TITLE VARCHAR(255) NULL,
DESCRIPTION MEDIUMTEXT NULL,
PRIMARY KEY(ID_ITEM)
);
INSERT INTO tt (ID_ITEM, TITLE, DESCRIPTION) VALUES (1,
'fghfjkgfd',
'first description');
INSERT INTO tt (ID_ITEM, TITLE, DESCRIPTION) VALUES (2,
'second',
'second description');
::
Previous Comments:
------------------------------------------------------------------------
[2005-02-25 14:35:17] [EMAIL PROTECTED]
Please try using this CVS snapshot:
http://snaps.php.net/php5-latest.tar.gz
For Windows:
http://snaps.php.net/win32/php5-win32-latest.zip
------------------------------------------------------------------------
[2005-02-17 20:17:12] mhe at ltcgroup dot de
perhaps it is a mysql client lib issue, i downt know ..
php side: increasing memory limit isnt a solution
mysql side: alter table isnt a solution
------------------------------------------------------------------------
[2005-02-17 20:10:27] mhe at ltcgroup dot de
MEDIUMTEXT ~ 2^24 bytes = 16777216 bytes, which php tries to allocate
php dies, memory limit reached ..
mh, lets play with this. so what happens, if i use TEXT, which seems to
work ..
so i use memory_get_usage() befor and after ->bind_result($ID_ITEM)
before: 48120
after: 113848
dif: 65728
2^16+2 = 65538, which is the size of TEXT .. *ouch :-?
..
what happens, if i bind 2 variables to a TEXT ..
"select DESCRIPTION as DD, DESCRIPTION as DD2, from tt"
$stmt->bind_result($ID_ITEM, $IDD);
before: 48424
after: 179640
dif: (179640 - 48424) / 2 = 65608 ~ 2 * 2 ^16
! notice: table was empty
------------------------------------------------------------------------
[2005-02-17 19:32:12] mhe at ltcgroup dot de
Description:
------------
submit a prepared query to mysqli ext using method prepare().
if i use bind_result to bind a column to a variable php crashes with
fatal error: memory limit, if the column in database is mediumtext. if
you alter this to text, everything works fine.
using mysqld 4.1.10
--output: php5 -v
micronium:~/phpn# php5 -v
PHP 5.0.3-1.dotdeb.0 (cli) (built: Dec 16 2004 13:08:20)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v2.0.3, Copyright (c) 1998-2004 Zend Technologies
-- mysql:
CREATE TABLE tt (
ID_ITEM INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
TITLE VARCHAR(255) NULL,
DESCRIPTION MEDIUMTEXT NULL,
PRIMARY KEY(ID_ITEM)
);
-- php:
$query = "
select
DESCRIPTION
from
tt
";
$stmt = $db->prepare($query);
$stmt->execute();
$stmt->bind_result($DESCRIPTION); //-- this is line 63
-- output:
Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to
allocate 16777216 bytes) in /root/phpn/run.php on line 63
Allowed memory size of 8388608 bytes exhausted (tried to allocate 256
bytes)
-- mysql:
ALTER TABLE `tt` CHANGE `DESCRIPTION` `DESCRIPTION` TEXT
-- php:
$query = "
select
DESCRIPTION
from
tt
";
$stmt = $db->prepare($query);
$stmt->execute();
$stmt->bind_result($ID_ITEM); //-- this is line 63
-- output:
::: everything is ok, no crahs, can go on
Reproduce code:
---------------
try to bind a MEDIUM text column to a variable, and php will crash ..
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=32013&edit=1