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

dd0*_*d0x 33 php memory

我对PHP有点新,我想知道:

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

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

此外,是否存在比较使用未设置和不使用未设置之间的差异的基准?

Gor*_*don 53

请参阅此示例(以及我在问题下面链接的文章):

$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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,PHP曾经用完了几乎两倍的内存.这是因为在分配'x'字符串之前$x,PHP在内存中构建新字符串,同时将前一个变量保存在内存中.这可以通过unsetting 来防止$x.

另一个例子:

for ($i=0; $i<3; $i++) {
    $str = str_repeat("Hello", 10000);
    echo memory_get_peak_usage(), PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

这将输出类似的东西

375696
425824
425824
Run Code Online (Sandbox Code Playgroud)

$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
Run Code Online (Sandbox Code Playgroud)

有关系吗?好吧,链接的文章总结得很好

除非是这样,否则这并不重要.

当您不再需要变量时,取消变量并没有什么坏处.也许您在共享主机上,并希望对大型数据集进行迭代.如果取消设置会阻止PHP以耗尽的XXXX字节的允许内存大小结束,那么这是值得的.

还应该考虑的是,即使请求生存期只是一秒,将内存使用量加倍有效地将可以提供的最大同时请求数减半.如果你无论如何都没有接近服务器的限制,那么谁在乎,但如果你是,那么一个简单的未设置可以为你节省更多的RAM或额外的服务器.


Aze*_*utt 8

在许多情况下,unset实际上不会释放大部分内容,因此除非代码的逻辑流程必须不存在,否则它的使用通常是毫无意义的.

  • 还应该说在脚本执行结束时释放所有内存,因此在执行结束之前取消设置对性能没什么好处(甚至可能是有害的). (3认同)

You*_*nse 5

用 C 等语言编写的应用程序通常会运行几个小时。但通常的 php 应用程序的运行时间仅为 0.05 秒左右。因此,使用 unset 就不那么重要了。

  • 虽然这可能是真的,但这并不是正确的答案。我已经运行 PHP 脚本好几天了。由于 PHP 被垃圾收集,脚本运行的时间在很大程度上是无关紧要的。 (6认同)
  • 答案还给人的印象是,在长时间运行的脚本中需要“unset”,并且“unset”相当于“free”。 (2认同)