免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5431 | 回复: 8
打印 上一主题 下一主题

PHP中内存使用讨论欢迎拍砖 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-17 09:51 |只看该作者 |倒序浏览
最近参加一个交流会

有人讨论到PHP中使用的内存的释放是这么讲的

"使用的变量 不使用时要哟你unset来释放掉来节约内存"

此时有人立即反驳:"unset并不释放内存"

此后无人讨论这个话题

最开始我个人的观点是unset不释放内存 理由很简单 我的测试结果都证明 一个耗费1G内存的脚本 无论如何释放,在top中哦你看到的还是占用1G   难道unset无用?

看这样一个脚步


  1.       1 <?php
  2.       2 echo memory_get_usage()."\n";
  3.       3
  4.       4 $a[]='a';
  5.       5 unset($a);
  6.       6 echo memory_get_usage()."\n";
  7.       7
  8.       8 $x[]='n';
  9.       9 unset($x);
  10.      10 echo memory_get_usage()."\n";
  11.      11
  12.      12 $c[]='a';
  13.      13 unset($c);
  14.      14 echo memory_get_usage()."\n";
  15.      15 ?>
复制代码


结果是这样的
50764          --->Start
51152          --->定义$a并释放
51152          --->定义$x并释放
51152          --->定义$c并释放


PHP是解释执行的过程
定义$a一定导致一次内存分配
定义$x也导致内存分配
但内存使用量没有增加 为什么  因为$a被释放了 $x使用的内存和$a一样 正好使用了$a释放的内存

是不是得出以下结论 :

1    unset释放内存了 释放的内存 还被整个脚本占用 以备复用

2    PHP仅在结束时候将全部内存释放掉 你不是放文件描述 数据库链接 也都会在此刻释放 不会导致资源泄漏

以前我们在C程序里面分配的内存 一定要自己释放否则就会泄漏 PHP中不需要了

[ 本帖最后由 eye_onme 于 2008-1-17 10:09 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-01-17 10:10 |只看该作者
php5有自己的内存管理机制, 会向操作系统申请大块内存, 并自己管理这块内存. 所以变量释放后只是将内存回收给php了,并没有回收给操作系统.

论坛徽章:
0
3 [报告]
发表于 2008-01-17 10:13 |只看该作者
unset确实释放了内存,参照php的源代码可以看到;

之所以内存用量没有变化,可能是运行优化的结果,如一次分配脚本所需的内存和复用;

修改上述测试代码,去掉unset一句,可以看到内存用量递增,而且增量“相同”(不严格)。

论坛徽章:
0
4 [报告]
发表于 2008-01-17 10:16 |只看该作者
我的code在操作大量数据时,有过溢出,我用unset就牙好身体棒了。。。自此我一直很注意unset。

论坛徽章:
3
金牛座
日期:2013-10-12 15:42:452015年辞旧岁徽章
日期:2015-03-03 16:54:15IT运维版块每日发帖之星
日期:2016-06-01 06:20:00
5 [报告]
发表于 2008-01-17 10:33 |只看该作者
呵呵,是不是DZ论坛的介绍?
那个人说php是共享内存模式,我的理解是所有变量共享系统为此脚本分配的内存,当已分配内存不够存放新的变量或已有变量占用的空间增多时,php就要占用系统更多的内存了。而unset一个变量只是把此变量注销掉,就像它的字面意思,并不释放此变量占用的内存,也就是把此变量请出了房间,并未把房子扒掉,当新分配变量或原有变量增大时 优先填充空闲房间,当空闲房间不能容下时,php就要新建房间(占用内存增加),只有当一个页面全部执行完后,才开始扒房,而且是一下全部扒掉。

嗨,能看懂相应的C代码就好了。

论坛徽章:
0
6 [报告]
发表于 2008-01-17 10:46 |只看该作者
我的猜想:
php对于内存的使用,如同在内存上建立一个tree(是否树俺不知道),建立变量就如同插入节点,节点可能放的只是数据存储地址,如果删除一个变量就要把内存归还给系统的话,意味着重建整个树(保证搜索快捷),所以只是置空节点。

感兴趣的可以直接在php的mail-list提出这个问题看看他们怎么回答。

论坛徽章:
0
7 [报告]
发表于 2008-01-17 11:19 |只看该作者
unset主要是递减对应的变量结构的引用计数,如果引用为0,就free该结构的内存。

论坛徽章:
0
8 [报告]
发表于 2008-01-17 11:35 |只看该作者
那想问一下,PHP程序内存不超过多少才能保证性能!(一般的小网站)

论坛徽章:
0
9 [报告]
发表于 2008-01-21 13:43 |只看该作者
根据个人经验,unset前最好加多一步$var = null;,楼主试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP