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

2022-08-30 13:38:06

我对PHP有点陌生,我想知道:

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

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

另外,是否有基准比较使用unset和不使用unset之间的区别?


答案 1

请参阅此示例(以及我在问题下方链接的文章):

$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'-string 赋值给 之前,PHP 会在内存中构建新字符串,同时也将前一个变量保存在内存中。这本来可以用叮叮当来预防。$xunset$x

另一个例子:

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

这将输出类似的东西

375696
425824
425824

在第一次迭代中,赋值前仍为空。在第二次迭代中,将保存生成的字符串。当 第二次调用 时,它不会立即覆盖 ,而是首先创建要在内存中分配的字符串。因此,您最终会得到并应分配的值。双倍内存。如果未设置 ,则不会发生这种情况:$str$strstr_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 字节的允许内存大小耗尽结束,那么值得付出微小的努力。

还应该考虑的是,即使请求生存期只有一秒钟,将内存使用量增加一倍实际上也会使可以处理的最大并发请求量减半。如果你远没有接近服务器的极限,那么谁在乎,但如果你是,那么一个简单的unset可以节省你更多的RAM或额外的服务器。


答案 2

在许多情况下,unset 实际上不会释放任何内容,因此它的使用通常是毫无意义的,除非代码的逻辑流需要它不存在。


推荐