Hướng dẫn ram cleaning in php

I have two simple questions. What is better/useful for memory cleanup.

$var = null;

or

unset($var);

I have one function with one cycle. I am getting (after few minutes)

Fatal error: Allowed memory size of 419430400 bytes exhausted

I am setting null and unset()-ing every object (at the end of the cycle) but still without any success :( I cant find out what is consuming memory.

And what about function calls in cycle? Will PHP release all allocations in these functions?(after call)

asked Aug 5, 2010 at 8:47

Michal DrozdMichal Drozd

1,2795 gold badges12 silver badges25 bronze badges

1

PHP itself confuses both concepts sometimes but, in general, a variable set to NULL is not the same as a variable that does not exist:

<?php

$foo = 'One';
$bar = 'Two';

$foo = NULL;
unset($bar);

var_dump($foo); // NULL
var_dump($bar); // Notice: Undefined variable: bar
var_dump(get_defined_vars()); // Only foo shows up: ["foo"]=> NULL

?>

answered Aug 5, 2010 at 9:10

Álvaro GonzálezÁlvaro González

137k38 gold badges253 silver badges340 bronze badges

3

unset() does just that, it unsets a variable; but it does not immediate free up memory.

PHP's garbage collector will actually free up memory previously used by variables that are now unset, but only when it runs. This could be sooner, when CPU cycles aren't actively being used for other work, or before the script would otherwise run out of memory... whichever situation occurs first.

And be aware that unset won't necessarily release the memory used by a variable if you have other references to that variable. It will simply delete the reference, and reduce the reference count for the actual stored data by 1.

EDIT While unset doesn't immediately release the memory used (only garbage collection actually does that) the memory that is no longer used as a result is available for the declaration of new variables

answered Aug 5, 2010 at 9:25

Hướng dẫn ram cleaning in php

Mark BakerMark Baker

206k31 gold badges338 silver badges380 bronze badges

4

I found problem.

First it was caused by xdebug profilling tools (i have turned on everything :) ) - and it consume lot of memory.

So remember: xdebug (when profilling turned on) consumes some memory in PHP process of your application

Second, I didn't release static members used in called functions.

answered Aug 5, 2010 at 13:20

Michal DrozdMichal Drozd

1,2795 gold badges12 silver badges25 bronze badges

1

If you unset the variable it is just marked, so on the next garbage collection it will be removed. If setting to null, the data of the variable gets overwritten.

Maybe see also the comments on the php manual: Unset Manual

At least this behaviour is also what i have encountered so far. But to fix it, you should first try to find out what is causing the memory to grow. The memory_get_usage function should be helpful for this.

answered Aug 5, 2010 at 9:36

enricogenricog

4,1865 gold badges32 silver badges53 bronze badges

And what about function calls in cycle? Will PHP release all allocations in these functions?(after call)

Once the execution leaves the scope of a function, all non-static variables are removed from memory.

answered Aug 5, 2010 at 8:49

MchlMchl

60.5k9 gold badges114 silver badges119 bronze badges

3

Not the answer you're looking for? Browse other questions tagged php memory-leaks unset or ask your own question.