php有垃圾回收机制吗?

wangshibuxiangti 2012-06-30 10:19:00
java new出的对象在不用的时候 jvm回收机制会自动销毁该对象 释放资源
php有差不多的垃圾回收机制吗? 还是都需要手工销毁?

谢谢各位大牛帮忙解答了
...全文
303 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄袍披身 2012-06-30
  • 打赏
  • 举报
回复
是的,吹牛逼的,我也不懂,所以你记得每次用完都要unset 和 mysql_close(); 记得最好是顺带把apache mysql 啥的都重启一次,要不行记得把系统也给重启一次,这样应该就真的unset了.

我还没见到php的自动销毁例子呢

做为一个开源了这么多年的东西,网上有各式各样开源代码的玩意,你居然没有见到过,那么你是不是应该做两个判断

1.不具备这样的例子
2.不需要这样的例子


在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁;这是PHP的GC垃圾处理机制,防止内存溢出。

当一个PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时被销毁。GC进程一般都跟着每起一个SESSION而开始运行的.gc目的是为了在session文件过期以后自动销毁删除这些文件.

Don`t thank me.I don`t like this discussion.



[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:

全能,全自动...

页面代码执行完毕 自动释放...

吹牛逼的吧 为何还要mysql_close() 还要unset 如果真如你所说 这些工作我们都不做了 系统帮我们搞定了 我还没见到php的自动销毁例子呢 大哥 如果你真的懂 麻烦给个测试例子 让我真的相信 thanks for your reply
[/Quote]
wangshibuxiangti 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

如果代码执行时间过长还是用unset 比较好点 因为他会在页面执行完成 后才释放 自动的总是没手动的好一些 我感觉
[/Quote]
这个不能靠感觉 得有例子 靠感觉会吃亏的 小兄弟 but i'm still say thanks for your suggestion
paomoer 2012-06-30
  • 打赏
  • 举报
回复
如果代码执行时间过长还是用unset 比较好点 因为他会在页面执行完成 后才释放 自动的总是没手动的好一些 我感觉
wangshibuxiangti 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

全能,全自动...

页面代码执行完毕 自动释放...
[/Quote]
吹牛逼的吧 为何还要mysql_close() 还要unset 如果真如你所说 这些工作我们都不做了 系统帮我们搞定了 我还没见到php的自动销毁例子呢 大哥 如果你真的懂 麻烦给个测试例子 让我真的相信 thanks for your reply
黄袍披身 2012-06-30
  • 打赏
  • 举报
回复
全能,全自动...

页面代码执行完毕 自动释放...
luojxun 2012-06-30
  • 打赏
  • 举报
回复
这个可以看手册“垃圾回收机制
每个变量都有个“引用计数”,当这个“引用计数”为0时就会启动垃圾回收
$testObj = 123;这句就是使得做为Test类的对象的$testObj的“引用计数”为0。
salmonl 2012-06-30
  • 打赏
  • 举报
回复
应该有吧
luojxun 2012-06-30
  • 打赏
  • 举报
回复
析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行(php手册 语言参考->类与对象->构造函数和析构函数)。利用这一点,就可以知道php什么时候执行了垃圾回收。通常垃圾回收都是在程序结束阶段,但是如果让系统知道这个变量以后不会使用了,php就会启动垃圾回收的。
class Test
{
function __construct()
{
echo __CLASS__ . ' Constructor is called.' . '<br />';
}

function __destruct()
{
echo __CLASS__ . ' Destructor is called.' . '<br />';
}
}

$testObj = new Test();

for($i = 0; $i < 10; $i++) echo $i . '<br />';

$testObj = 123; // 这条语句可以让php确定做为Test类的对象的$testObj可以回收,然后重新生成一个int的变量
echo $testObj;

因此结果就是:
Test Constructor is called.
0
1
2
3
4
5
6
7
8
9
Test Destructor is called.
123

这样我们就看到了垃圾的回收。垃圾回收通过特殊手段是可以看到的。
蹲坑看月亮 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
php 出生的时候, C++已经很健壮了。不好意思,那时java还在娘胎里

什么东西称为“垃圾”,当然是不再使用的了
mysql_close()、unset()...等等都是通知 php 某些东西已经不再需要了,比方说你

你当然看不到 php的自动销毁例子 ,如果被你看到了,就不是“自动”而是“手动了”
[/Quote]
精辟,精辟呀,高人就是高人,LZ 不要纠结了~~
jackfans 2012-06-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
php 出生的时候, C++已经很健壮了。不好意思,那时java还在娘胎里

什么东西称为“垃圾”,当然是不再使用的了
mysql_close()、unset()...等等都是通知 php 某些东西已经不再需要了,比方说你

你当然看不到 php的自动销毁例子 ,如果被你看到了,就不是“自动”而是“手动了”
[/Quote]
不错。
xuzuning 2012-06-30
  • 打赏
  • 举报
回复
php 出生的时候, C++已经很健壮了。不好意思,那时java还在娘胎里

什么东西称为“垃圾”,当然是不再使用的了
mysql_close()、unset()...等等都是通知 php 某些东西已经不再需要了,比方说你

你当然看不到 php的自动销毁例子 ,如果被你看到了,就不是“自动”而是“手动了”
luojxun 2012-06-30
  • 打赏
  • 举报
回复
以上例子还说明一个情况,系统的垃圾回收机制不是那么的智能,当一个占用资源很大的变量,比如一个图片资源,在不用时应该立刻进行销毁。
luojxun 2012-06-30
  • 打赏
  • 举报
回复
5楼说得在理。给个例子说明一下。类中的析构函数就是在垃圾回收时执行的,那么就可以利用这一点。

class Test
{
function __construct()
{
echo __CLASS__ . ' Constructor is called.' . '<br />';
}

function __destruct()
{
echo __CLASS__ . ' Destructor is called.' . '<br />';
}
}

$testObj = new Test();

for($i = 0; $i < 10; $i++) echo $i . '<br />';

$testObj = 123;
echo $testObj;

结果:

Test Constructor is called.
0
1
2
3
4
5
6
7
8
9
Test Destructor is called.
123

当系统确定一个变量不再被使用时就会启动垃圾回收机制的。除非处于安全考虑unset(本人见过有些系统会这样做,但是我觉得安全机制这样保证也没有太大意义),否则没必要unset。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧