Edit report at http://bugs.php.net/bug.php?id=55033&edit=1
ID: 55033
Comment by: rodney dot rehm at medialize dot de
Reported by: rodney dot rehm at medialize dot de
Summary: Memory Leak in magic method __get() [Zend Memory
Manager]
Status: Bogus
Type: Bug
Package: Performance problem
Operating System: Mac OS X 10.6.7
PHP Version: 5.3.6
Block user comment: N
Private report: N
New Comment:
Just to get this straight. This is not a bug, it's expected behavior.
Anything returned from a magic method is internally handled as a copy. That
means that anything a magic methods returns, even if it's a reference to
another object, is kept in memory. That is, until the $object the magic methods
were invoked on, is unset().
Are you kidding me? Not a bug? Where is this not a bug?
A note on this topic wouldn't harm the docs, you know?
Previous Comments:
------------------------------------------------------------------------
[2011-06-11 17:02:32] [email protected]
A copy of returned variable is done.
------------------------------------------------------------------------
[2011-06-11 17:01:14] rodney dot rehm at medialize dot de
What exactly do you mean by "separating return from __get()"? The memory is
pumped regardless of how I return (value, reference). How am I supposed to
"separate" here?
------------------------------------------------------------------------
[2011-06-11 16:48:14] [email protected]
There is no memleak, what happens is that the return from __get() needs to be
separated.
See bug #48197
------------------------------------------------------------------------
[2011-06-11 14:40:52] rodney dot rehm at medialize dot de
Description:
------------
For some reason values returned by __get() aren't released from memory.
$ php memory.php # (without --debug)
0.0096 seconds and 1.3461 MB for 10000 accessing known property
$ php memory.php # (with --debug)
0.0317 seconds and 2.6435 MB for 10000 accessing known property
$ export USE_ZEND_ALLOC=0
$ php memory.php # (with --debug)
0.0267 seconds and 0.0000 MB for 10000 accessing known property
since disabling Zend Memory Manager solved the issue, the valgrind log is
pretty much useless, thus not attached.
Test script:
---------------
<?php
class Memleak
{
public function __get($name)
{
return "hello world";
}
}
$iterations = 10000;
$foo = new Memleak();
$start = microtime(true);
$mem = memory_get_usage();
for ($i=0; $i < $iterations; $i++) {
$foo->{'bar' . $i};
}
$_mem = memory_get_usage();
$_start = microtime(true);
printf("%0.4f seconds and %0.4f MB for %d accessing known property\n", $_start
- $start, ($_mem - $mem) / 1024 / 1024, $iterations);
?>
Expected result:
----------------
0.0099 seconds and 0.0000 MB for 10000 accessing known property
Actual result:
--------------
0.0099 seconds and 1.3460 MB for 10000 accessing known property
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/bug.php?id=55033&edit=1