ID:               25853
 Updated by:       [EMAIL PROTECTED]
 Reported By:      morgan at mindviz dot com
-Status:           Open
+Status:           Bogus
-Bug Type:         Feature/Change Request
+Bug Type:         *General Issues
 Operating System: RedHat Linux 8.0
 PHP Version:      4.3.3
 New Comment:

I was a bit fast with this, thanks to Ilia who pointed out the flaws in
your example. Try the following and you'll
see that unset() does free the memory just fine:

#!/root/php-4.3.3/php -n
<?php
    $my_pid = getmypid();

    for($z = 0; $z < 10; $z++) {
        $test_array = array();

        for($i = 0; $i < 5; $i++) {
           $test_array[] = str_repeat("testing", 100000);
        }

        echo "$z: MEMORY USAGE BEFORE UNSET ( % KB PID ) : ".`ps -eo
%mem,rss,pid | grep $my_pid`;
        unset($test_array);
        echo "$z: MEMORY USAGE  AFTER UNSET ( % KB PID ) : ".`ps -eo
%mem,rss,pid | grep $my_pid`."\n";
    }

    exit;
?>




Previous Comments:
------------------------------------------------------------------------

[2003-10-13 19:45:34] morgan at mindviz dot com

As it stands right now my real php cli app that I'm 
running on my server has slowly grown to 100MB in 
memory so far, and is still going up because of this 
problem.

I'm actually considering moving to perl or something 
else because for non web-based scripts and apps that 
don't terminate right away this is a horrible flaw.

------------------------------------------------------------------------

[2003-10-13 19:40:18] morgan at mindviz dot com

so then what function does free memory? Clearly if you 
have a cli version of php for servers or daemon 
applications there is a need to free the memory used by 
variables or any server could potentially exhaust the 
system's available memory.

I don't see how that is bogus in any which way.

If you are creating a never ending application that 
actually does stuff, read files of varying sizes and 
uses variables to temporarily store the data in memory 
there is an obvious need to free up the memory used by 
those variables when they are no longer needed since 
the daemon application won't ever terminate.

Is there going to be a solution for this? or is there a 
function that I have overlooked that will free up the 
memory of a variable that I no longer need?

------------------------------------------------------------------------

[2003-10-13 18:00:51] [EMAIL PROTECTED]

unset() does not free any memory. This is by design.


------------------------------------------------------------------------

[2003-10-13 13:17:25] morgan at mindviz dot com

Description:
------------
Basically I'm writing a php-CLI server application that 
will never exit unlike an apache process. I have been 
attempting to find out why slowly but surely the memory 
usage of my CLI app steadily goes up until it has 
exhausted all my available memory.

The server app will read in large data sets at times 
and then attempts to free those with the unset 
function. With further inspection it seems that even 
though unset is called the script still has a hold on 
or uses the allocated memory and never returns it to 
the system.

The code below is a small script that I put together to 
show the issue I am seeing, it is quite easy to 
reproduce the problem.

As with my server application if the script below was 
run forever and the max value of $z in the loop was set 
extremely high it would run until all the system's 
memory was used up, since unset is not actually 
returning any of the used memory for the test_array 
back to the system.

Reproduce code:
---------------
#!/root/php-4.3.3/php -n
<?php
    $my_pid = getmypid();

    echo "GOT PID: ".`ps -eo %mem,rss,pid | grep $my_pid`."\n";

    for($z = 0; $z < 10; $z++) {
        $test_array = array();

        // Build a Test 5x(1000*$z) array, will show incremental mem
usage and after unset
        // line will test_array's memory will not be free'd
        for($i = 0; $i < 5; $i++) {
            for($j = 0; $j < 1000*$z; $j++) {
                $test_array[$i][$j] = "testing $i $j\n";
            }
        }

        echo "$z: MEMORY USAGE BEFORE UNSET ( % KB PID ) : ".`ps -eo
%mem,rss,pid | grep $my_pid`;
        unset($test_var);
        echo "$z: MEMORY USAGE  AFTER UNSET ( % KB PID ) : ".`ps -eo
%mem,rss,pid | grep $my_pid`."\n";
    }

    exit;
?>

Expected result:
----------------
GOT PID:  0.1 1524  3178

0: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.1 1532  
3178
0: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.1 1524  
3178

1: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.2 2132  
3178
1: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.1 1524  
3178

2: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.3 2740  
3178
2: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.1 1524  
3178

3: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.3 3368  
3178
3: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.1 1524  
3178

4: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.4 3952  
3178
4: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.1 1524  
3178

5: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.5 4620  
3178
5: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.1 1524  
3178

6: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.5 5204  
3178
6: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.1 1524  
3178

7: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.6 5792  
3178
7: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.1 1524  
3178

8: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.7 6376  
3178
8: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.1 1524  
3178

9: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.7 7124  
3178
9: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.1 1524  
3178

Actual result:
--------------
GOT PID:  0.1 1524  3178

0: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.1 1532  
3178
0: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.1 1532  
3178

1: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.2 2132  
3178
1: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.2 2132  
3178

2: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.3 2740  
3178
2: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.3 2740  
3178

3: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.3 3368  
3178
3: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.3 3368  
3178

4: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.4 3952  
3178
4: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.4 3952  
3178

5: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.5 4620  
3178
5: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.5 4620  
3178

6: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.5 5204  
3178
6: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.5 5204  
3178

7: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.6 5792  
3178
7: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.6 5792  
3178

8: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.7 6376  
3178
8: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.7 6376  
3178

9: MEMORY USAGE BEFORE UNSET ( % KB PID ) :  0.7 7124  
3178
9: MEMORY USAGE  AFTER UNSET ( % KB PID ) :  0.7 7124  
3178


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=25853&edit=1

Reply via email to