【问题标题】:php - what's the benefit of unsetting variables? [duplicate]php - 取消设置变量有什么好处? [复制]
【发布时间】:2011-02-17 14:59:53
【问题描述】:

可能的重复:
What's better at freeing memory with PHP: unset() or $var = null

在 php 中取消设置变量有真正的好处吗?

class test {

  public function m1($a, $b)
    $c = $a + $b;
    unset($a, $b);
    return $c;
  }
}

取消设置变量是否真的不会减少运行时的内存消耗?

【问题讨论】:

  • 在 php 5.3 中你有一个垃圾收集器,所以你可以忽略它,但是当你在 php 5.2 中运行大脚本并使用大数组时,你会发现自己处理内存泄漏问题,所以你可能会意识到取消设置变量
  • 可能还想看这个:tuxradar.com/practicalphp/18/1/10
  • 这个问题肯定和上面提到的问题有重叠,但是问题的标题其实很具体,很可能会被别人搜索。我不会说这是重复的。
  • 这两个问题都出现在我的搜索中,我特意首先点击了这个问题,因为它正是我要找的。 “重复”显然没有这种强烈的第一印象(至少对我而言)。

标签: php


【解决方案1】:

取消设置变量是真的吗 实际上并没有减少内存 运行时消耗?

是的。来自PHP.net:

unset() 就像它的名字所说的那样 - 取消设置变量。它不会强制立即释放内存。 PHP的 垃圾收集器会在它发生时 看到合适 - 有意尽快,如 无论如何都不需要那些CPU周期, 或者在脚本之前 内存不足,无论发生什么 首先。

如果你正在做 $whatever = null; 那么你正在重写变量的 数据。你可能会释​​放内存/ 缩小得更快,但它可能会窃取 CPU 从真正需要的代码循环 他们更快,导致更长的时间 总执行时间。

关于你的其他问题:

还有什么理由取消设置 除了破坏之外的变量 会话变量例如或 范围?

不是真的,你总结得差不多了。

【讨论】:

  • 我猜提到的问题的其他部分已被编辑掉,也许缺少逗号导致我误解它,但还有很多其他原因可能导致您想要取消设置一个变量,它超出了仅删除特定范围内的 session 数据的范围。通常,其目的是明确意图并防止进一步使用该变量。想象一个服务器,其中两个站点使用相同的代码库,但索引不同。程序员必须在两个索引之间查看,以找出哪些变量可以/应该安全地在代码库的其他地方使用。
  • 虽然我意识到有人类可读的 cmets、命名约定和其他手动限制范围(类、块)的方法,但原则立场和对不需要或本地化数据的访问不应该提供给程序的其余部分,限制其范围并不总是可行或实际的。我想说在生产级别删除unset() 是完全可以的,只要您传递给输出的数据在其自己的输出范围内。
【解决方案2】:

PHP 会使用垃圾收集器自行清理内存,而且它通常做得很好。取消设置只会明确表明您已完成该特定变量。

【讨论】:

    【解决方案3】:

    对于简单的数据类型可能没有任何好处,但对于您想使用该命令释放这些资源的任何系统资源。

    【讨论】:

      【解决方案4】:

      这取决于变量是什么。如果它是一个消耗几兆数据的大型数组,并且您的脚本将来可能需要大量内存(即:在它完成执行之前),那么明智的做法是将此内存标记为可通过取消设置来使用数组。

      也就是说,这只有在数组仍在作用域内时才真正有用,否则 PHP 将有效地自动处理它。

      就您提供的示例而言,无需使用 unset,因为这些变量会立即超出范围。

      【讨论】:

        【解决方案5】:

        尽管 PHP 自己的垃圾回收并没有真正的好处,但我偶尔会unset() 变量在代码中明确表示 var 的角色已经完成,将不再被访问或分配。我倾向于不使用原子数据类型,而是使用脚本中的主要参与者 - 配置单例、大型对象等。

        【讨论】:

        • 您也可以使用评论来做到这一点,例如// unset foobar。这样做的好处是根本不运行任何代码。
        【解决方案6】:

        它释放你的脚本正在使用的内存。见http://ie2.php.net/memory_get_usage。

        优势在于处理大量数据的脚本,您可能会遇到内存不足错误,请参阅 memory_limit ini 设置了解更多信息。

        所以,是的,这可能有好处,但除非您处理大量数据,否则您不需要使用它。

        您可能还想取消设置变量以防止以后使用它们的值,但如果是这种情况,则可能会认为您的代码需要以不同的方式编写以防止此类事情发生。

        【讨论】:

          【解决方案7】:

          如未设置中所述

          unset() 就像它的名字所说的那样 - 取消设置一个变量。 它不会强制立即释放内存。 PHP 的垃圾收集器会在它认为合适的时候执行它 - 有意尽快, 因为无论如何都不需要这些 CPU 周期, 或者直到脚本内存不足,无论先发生什么。 如果你正在做 $whatever = null; 那么你正在重写变量的数据。 您可能会更快地释放/缩小内存, 但它可能会更快地从真正需要它们的代码中窃取 CPU 周期, 导致整体执行时间更长。

          【讨论】:

          • 你能分享一下这个结论的例子(或相关主题)吗?我只是想了解'它可能会从真正需要它们的代码中窃取 CPU 周期'更多..
          猜你喜欢
          • 2012-10-29
          • 2015-03-05
          • 2019-08-22
          • 1970-01-01
          • 1970-01-01
          • 2012-02-10
          • 1970-01-01
          • 2011-07-22
          • 2016-10-01
          相关资源
          最近更新 更多