views:

299

answers:

2

When I use file_get_contents and pass it as a parameter to another function, without assigning it to a variable, does that memory get released before the script execution finishes?

For Example:

preg_match($pattern, file_get_contents('http://domain.tld/path/to/file.ext'), $matches);

Will the memory used by file_get_contents be released before the script finishes?

A: 

In your example the memory will be released when $matches goes out of scope.
If you weren't storing the result of the match the memory would be released immediately

meouw
+7  A: 

The temporary string created to hold the file contents will be destroyed. Without delving into the sources to confirm, here's a couple of ways you can test that a temporary value created as a function parameter gets destroyed:

Method 1: a class which reports its destruction

This demonstrates lifetime by using a class which reports on its own demise:

class lifetime
{
    public function __construct()
    {
         echo "construct\n";
    }
    public function __destruct()
    {
         echo "destruct\n";
    }


}

function getTestObject()
{
   return new lifetime();
}


function foo($obj)
{
   echo "inside foo\n";
}




echo "Calling foo\n";
foo(getTestObject());
echo "foo complete\n";

This outputs

Calling foo
construct
inside foo
destruct
foo complete

Which indicates that the implied temporary variable is destroyed right after the foo function call.

Method 2: measure memory usage

Here's another method which offers further confirmation using memory_get_usage to measure how much we've consumed.

function foo($str)
{
   $length=strlen($str);

   echo "in foo: data is $length, memory usage=".memory_get_usage()."\n";
}

echo "start: ".memory_get_usage()."\n";
foo(file_get_contents('/tmp/three_megabyte_file'));
echo "end: ".memory_get_usage()."\n";

This outputs

start: 50672
in foo: data is 2999384, memory usage=3050884
end: 51544
Paul Dixon