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

问题描述:

我对PHP有点新,我想知道:在PHP中取消设置变量有多重要?我知道像C这样的语言,我们释放分配的内存以防止泄漏等。通过在使用变量时使用未设置的变量,这将显着提高我的应用程序的性能吗?在PHP中取消设置变量有多重要?

还有一个比较使用未设置和未使用未设置的区别的基准吗?

+0

*(相关)* 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

+0

感谢您的链接。他们给出了很好的解释。 – dd0x 2010-04-11 16:29:12

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或额外的服务器。

+0

在当前的项目中,我使用PHP通过移动循环来生成大量可变大小的HTML页面,所以我应该在每个循环结束时清除保存内容的变量。这可能是“关键”正确的? – dd0x 2010-04-11 17:22:48

+0

@ dd0x理论上,是的。但实际上,您应该使用XDebug之类的功能来分析您的应用程序,以确定它是否非常重要。我认为在PHP中更多地使用缩放优化而非绝对必要。 – Gordon 2010-04-11 17:31:20

+0

@ dd0x只需添加一下,PHP就有一个垃圾收集器,可以确保99.9%的时间不必担心。 – Yacoby 2010-04-11 21:11:03

用C语言编写的应用程序通常运行数小时。但通常的PHP应用程序的运行时间仅为0.05秒。所以,使用未设置就不那么重要了。

+5

虽然它可能是真的,但它不是正确的答案。我已经运行脚本PHP数天了。由于PHP是垃圾收集,脚本运行的时间大部分是不相关的。 – Yacoby 2010-04-11 17:05:28

+2

答案也给人一种印象,即在长时间运行的脚本中需要“unset”,而“unset”与“free”等价。 – Yacoby 2010-04-11 17:11:59

+0

@Yacoby“*我已经运行脚本PHP的天*”也许你需要看看使用别的东西来完成这样的特定任务。 PHP更适合于Web应用程序,并且网页无需运行数日。当然,现在5年的网络服务器功能要强大得多(甚至每月3英镑的廉价主机),PHP垃圾收集功能也得到了改进。不建议取消设置释放资源的变量。 – James 2015-06-26 13:48:22

在许多情况下,unset不会实际释放大部分内容,所以它的使用通常是毫无意义的,除非您的代码的逻辑流程需要它的不存在。

+3

也应该说所有的内存都在脚本执行结束时被释放,所以在执行结束之前取消设置对性能没有什么好处(甚至可能是有害的)。 – mattbasta 2010-04-11 16:38:10

这取决于你应该确保你的网页很长(例如从db中选择的博客文章的内容)。

<?php 
$post = get_blog_post(); 
echo $post; 
unset($post); 
?>