在PHP中取消设置变量有多重要?

时间:2010-04-11 16:14:15

标签: php memory

我对PHP有些新意,我想知道:

  

在PHP中取消设置变量有多重要?

我知道在像C这样的语言中,我们释放分配的内存以防止泄漏等。通过在完成变量时使用unset对变量,这会显着提高我的应用程序的性能吗?

此外,是否存在比较使用未设置和未使用未设置之间差异的基准?

4 个答案:

答案 0 :(得分:52)

请参阅this example(以及我在问题下面链接的article):

$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n";      // 120172
echo memory_get_peak_usage() . "<br>\n"; // 121248

$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n";      // 120172
echo memory_get_peak_usage() . "<br>\n"; // 201284

正如您所看到的,有一次PHP耗尽了几乎两倍的内存。这是因为在将'x'字符串分配给$x之前,PHP在内存中构建新字符串,同时将前一个变量保存在内存中。这可以通过unset ting $x来阻止。

另一个例子:

for ($i=0; $i<3; $i++) {
    $str = str_repeat("Hello", 10000);
    echo memory_get_peak_usage(), PHP_EOL;
}

这将输出类似

的内容
375696
425824
425824

在第一次迭代时,$str在分配之前仍为空。在第二次迭代$str将保留生成的字符串。当第二次调用str_repeat时,它不会立即覆盖$str,而是首先创建要在内存中分配的字符串。因此,您最终得到$str及其应分配的值。双重记忆。如果您取消设置$str,则不会发生这种情况:

for($i=0;$i<3;$i++) {
    $str = str_repeat("Hello", 10000);
    echo memory_get_peak_usage(), PHP_EOL;
    unset($str);
}

// outputs something like
375904
376016
376016

重要吗?好吧,链接的文章总结得很好

  

除非是这样,否则这并不重要。

当您不再需要变量时,取消设置变量并没有什么坏处。也许您在共享主机上,并希望对大型数据集进行迭代。如果取消设置会阻止PHP以允许的内存大小XXXX字节耗尽结束,那么这是值得的。

还应该考虑的是,即使请求生命周期只是一秒钟,内存使用量加倍也会有效地减少可以提供的最大同时请求数量。如果你无论如何都没有接近服务器的限制,那么谁在乎,但如果你在,那么一个简单的未设置可以为你节省更多RAM或额外服务器的钱。

答案 1 :(得分:8)

在很多情况下,unset实际上不会解除分配任何东西,所以除非你的代码的逻辑流程必须不存在,否则它的使用通常是毫无意义的。

答案 2 :(得分:3)

用C语言编写的应用程序通常运行很长时间。但通常的php应用程序的运行时间只有0.05秒左右。因此,使用unset并不重要。

答案 3 :(得分:0)

这取决于你应该确保unset非常长的字符串(例如从数据库中选择的博客文章内容)。

<?php
$post = get_blog_post();
echo $post;
unset($post);
?>