为了账号安全,请及时绑定邮箱和手机立即绑定

在用PHP释放内存方面有什么更好的:unset()或$var=null

在用PHP释放内存方面有什么更好的:unset()或$var=null

PHP
摇曳的蔷薇 2019-07-04 13:40:37
在用PHP释放内存方面有什么更好的:unset()或$var=null我意识到第二种方法避免了函数调用的开销(更新,实际上是一种语言结构),但是知道其中一种是否比另一种更好是很有趣的。我一直在用unset()在我的大部分编码中,但是最近我已经浏览了一些在网络上找到的、值得尊敬的类,这些类使用$var = null相反。是否有更好的选择,原因是什么?
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

这是在2009年未设置手册页:

unset()做它的名字说的-取消一个变量。它不强制立即释放内存。PHP的垃圾收集器会在它认为合适的时候完成它,因为这些CPU周期无论如何都不需要,或者是在脚本耗尽内存之前,不管首先发生什么。

如果你在做$whatever = null;然后重写变量的数据。您可能会更快地释放/缩小内存,但它可能会更快地从真正需要它们的代码中窃取CPU周期,从而导致更长的总体执行时间。

(自2013年以来,unset手册页不要再包括那部分了)

请注意,直到php5.3,如果您有循环引用中的两个对象,例如在父-子关系中,对父对象调用unset()将不会释放用于子对象中父引用的内存。(当父对象被垃圾收集时,内存也不会被释放。)虫33595)


问题“未设置与=NULL之间的差异“详细说明一些不同之处:


unset($a)也移除$a来自符号表;例如:

$a = str_repeat('hello world ', 100);unset($a);var_dump($a);

产出:

Notice: Undefined variable: a in xxx
NULL

但当$a = null使用:

$a = str_repeat('hello world ', 100);$a = null;var_dump($a);Outputs:NULL

看来$a = null比它快一点unset()相对应:更新符号表条目似乎比删除它更快。


  • 当您尝试使用不存在的

    unset

    )变量,则会触发错误,变量表达式的值将为NULL。(因为,PHP还应该做什么呢?每个表达式都需要得到一些值。)
  • 一个赋值为空的变量仍然是一个完全正常的变量。


查看完整回答
反对 回复 2019-07-04
?
守着一只汪

TA贡献1872条经验 获得超3个赞

unset实际上不是一个函数,而是一个语言结构..它不是一个函数调用,而是一个return或者include.

除了性能问题之外,使用unset使你的代码意图更清楚了。


查看完整回答
反对 回复 2019-07-04
?
智慧大石

TA贡献1946条经验 获得超3个赞

通过对变量执行unset()操作,您实际上已经将变量标记为“垃圾收集”(PHP实际上没有一个,但例如),因此内存无法立即可用。变量不再容纳数据,但堆栈保持较大的大小。执行NULL方法会立即删除数据并缩小堆栈内存。

这是来自个人的经验,也来自其他人。参见unset()函数的注释这里.

我个人在循环中的迭代之间使用unset(),这样我就不必延迟堆栈的大小了。数据消失了,但足迹依然存在。在下一次迭代中,内存已经被php占用,因此更快地初始化了下一个变量。


查看完整回答
反对 回复 2019-07-04
  • 3 回答
  • 0 关注
  • 819 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信