file_get_contents()使用的内存在未分配给变量时是否会被释放?

时间:2009-02-02 14:12:17

标签: php memory-consumption

当我使用file_get_contents并将其作为参数传递给另一个函数而不将其分配给变量时,是否在脚本执行完成之前释放了该内存?

例如:

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

在脚本完成之前,是否会释放file_get_contents使用的内存?

4 个答案:

答案 0 :(得分:9)

为了保存文件内容而创建的临时字符串将被销毁。在不深入研究来源的情况下,您可以通过以下几种方法测试作为函数参数创建的临时值是否被破坏:

方法1:报告其销毁的类

这通过使用报告其自身消亡的类来证明生命周期:

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";

此输出

Calling foo
construct
inside foo
destruct
foo complete

表示在foo函数调用之后,隐含的临时变量 被销毁。

方法2:测量内存使用量

这是另一种方法,它使用memory_get_usage来衡量我们消耗了多少钱。

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";

此输出

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

答案 1 :(得分:0)

在您的示例中,当$matches超出范围时,将释放内存 如果你没有存储匹配的结果,内存将立即释放

答案 2 :(得分:0)

以下代码内存使用= 6493720

开始:1050504

结束:6492344

echo "start: ".memory_get_usage()."\n";
$data = file_get_contents("/six_megabyte_file");
echo "end: ".memory_get_usage()."\n";

但以下代码中的内存使用情况= 1049680

start = 1050504

end = 1050976

echo "start: ".memory_get_usage()."\n";
file_get_contents("/six_megabyte_file");
echo "end: ".memory_get_usage()."\n";

注意:在第一个代码文件中存储变量。

答案 3 :(得分:0)

如果您认为这有助于避免内存错误不足,那么您就错了。您的代码(bytes_format):

<?php
$url = 'http://speedtest.netcologne.de/test_10mb.bin';
echo 'Before: ' . bytes_format(memory_get_usage()) . PHP_EOL;
preg_match('~~', file_get_contents($url), $matches);
echo 'After: ' . bytes_format(memory_get_usage()) . PHP_EOL;
echo 'Peak: ' . bytes_format(memory_get_peak_usage(true)) . PHP_EOL;
?>

使用10.5 MB:

Before: 215.41 KB
After: 218.41 KB
Peak: 10.5 MB

和这段代码:

<?php
$url = 'http://speedtest.netcologne.de/test_10mb.bin';
echo 'Before: ' . bytes_format(memory_get_usage()) . PHP_EOL;
$contents = file_get_contents($url);
preg_match('~~', $contents, $matches);
unset($contents);
echo 'After: ' . bytes_format(memory_get_usage()) . PHP_EOL;
echo 'Peak: ' . bytes_format(memory_get_peak_usage(true)) . PHP_EOL;
?>

也使用10.5 MB:

Before: 215.13 KB
After: 217.64 KB
Peak: 10.5 MB

如果您想保护自己的脚本,则需要使用$length参数或read the file in chunks