我对PHP还比较新,想知道:
在PHP中取消变量的设置有多重要?
我知道在像C这样的语言中,我们释放分配的内存以防止泄漏等问题。 在完成变量使用后使用unset命令,是否会显着提高应用程序的性能?
此外,是否有任何基准测试可以比较使用unset和不使用unset之间的差异?
我对PHP还比较新,想知道:
在PHP中取消变量的设置有多重要?
我知道在像C这样的语言中,我们释放分配的内存以防止泄漏等问题。 在完成变量使用后使用unset命令,是否会显着提高应用程序的性能?
此外,是否有任何基准测试可以比较使用unset和不使用unset之间的差异?
$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
来防止这种情况发生。
另一个例子:
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 引发 Allowed memory size of XXXX bytes exhausted 错误,那么这一微小的努力就值得了。
还应该考虑到的是,即使请求生命周期只有一秒钟,将内存使用量翻倍也会有效地减半可以同时处理的最大请求数量。如果你离服务器的限制很远,那无所谓,但如果你接近限制,那么一个简单的取消设置操作就能为你节省购买更多 RAM 或另外一个服务器的资金。
在许多情况下,unset实际上不会释放太多东西,因此它的使用通常是毫无意义的,除非您的代码逻辑需要它不存在。
使用类似C语言编写的应用程序通常运行数小时。但通常php应用程序的运行时间仅约为0.05秒。因此,使用unset函数并不是非常重要。
unset
,而unset
相当于free
。 - Yacoby这要看情况,你应该确保取消设置非常长的字符串(例如从数据库中选择的博客文章内容)。
<?php
$post = get_blog_post();
echo $post;
unset($post);
?>