在PHP中取消设置变量有多重要?
我对PHP有点新,我想知道:在PHP中取消设置变量有多重要?我知道像C这样的语言,我们释放分配的内存以防止泄漏等。通过在使用变量时使用未设置的变量,这将显着提高我的应用程序的性能吗?在PHP中取消设置变量有多重要?
还有一个比较使用未设置和未使用未设置的区别的基准吗?
见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
$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或额外的服务器。
用C语言编写的应用程序通常运行数小时。但通常的PHP应用程序的运行时间仅为0.05秒。所以,使用未设置就不那么重要了。
虽然它可能是真的,但它不是正确的答案。我已经运行脚本PHP数天了。由于PHP是垃圾收集,脚本运行的时间大部分是不相关的。 – Yacoby 2010-04-11 17:05:28
答案也给人一种印象,即在长时间运行的脚本中需要“unset”,而“unset”与“free”等价。 – Yacoby 2010-04-11 17:11:59
@Yacoby“*我已经运行脚本PHP的天*”也许你需要看看使用别的东西来完成这样的特定任务。 PHP更适合于Web应用程序,并且网页无需运行数日。当然,现在5年的网络服务器功能要强大得多(甚至每月3英镑的廉价主机),PHP垃圾收集功能也得到了改进。不建议取消设置释放资源的变量。 – James 2015-06-26 13:48:22
在许多情况下,unset不会实际释放大部分内容,所以它的使用通常是毫无意义的,除非您的代码的逻辑流程需要它的不存在。
也应该说所有的内存都在脚本执行结束时被释放,所以在执行结束之前取消设置对性能没有什么好处(甚至可能是有害的)。 – mattbasta 2010-04-11 16:38:10
这取决于你应该确保你的网页很长(例如从db中选择的博客文章的内容)。
<?php
$post = get_blog_post();
echo $post;
unset($post);
?>
*(相关)* http://www.php.net/manual/en/features.gc.refcounting-basics.php和http://blog.preinheimer.com/index.php?/归档/ 354-Memory-usage-in-PHP.html – Gordon 2010-04-11 16:17:47
感谢您的链接。他们给出了很好的解释。 – dd0x 2010-04-11 16:29:12