我对PHP有些新意,我想知道:
在PHP中取消设置变量有多重要?
我知道在像C这样的语言中,我们释放分配的内存以防止泄漏等。通过在完成变量时使用unset对变量,这会显着提高我的应用程序的性能吗?
此外,是否存在比较使用未设置和未使用未设置之间差异的基准?
答案 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);
?>