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



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

另外,是否有基准可以比较使用未设置和不使用未设置之间的区别?

最佳答案

参见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字节的允许内存大小耗尽而结束,那么值得付出很小的努力。

还应该考虑的是,即使请求生存期仅是一秒钟,将内存使用量增加一倍也可以将可同时服务的最大请求数量减半。如果您仍然无法达到服务器的极限,那么谁在乎,但是如果您不在,那么简单的设置就可以为您节省更多内存或额外服务器的费用。

09-27 23:04
查看更多