频道栏目
首页 > 资讯 > WEB服务 > 正文

php内存管理简介

16-01-07        来源:[db:作者]  
收藏   我要投稿
程序先创建一个$a变量, 然后赋值$a变量为’HelloWorld’.然后创建$b变量,把$a变量赋值给$b变量.在这里我们要思考的是,现在内存情况是怎样的.假如$a变量的内存占用为22字节(假设值)的话,那$b占用多少字节呢? 22字节? 还是小于22字节呢? 答案是小于22字节.那PHP是怎样实现的呢?
其实PHP是通过refcount来实现的.当一个变量赋值给另外一个变量的时候, PHP只是简单的把变量的refcount的值加1.使用的是zend_hash_add函数和ZVAL_ADDREF宏.详细可以参考以下代码:
[php]
{
 zval*helloval;
 MAKE_STD_ZVAL(helloval);
 ZVAL_STRING(helloval,"HelloWorld",1);
 zend_hash_add(EG(active_symbol_table),"a",sizeof("a"),&helloval,sizeof(zval*),NULL);
 ZVAL_ADDREF(helloval);
 zend_hash_add(EG(active_symbol_table),"b",sizeof("b"),&helloval,sizeof(zval*),NULL);
}[/php]

从上面的代码可以看到变量是没有增加的, 依然是helloval一个变量.但是我们还可以看到通过ZVAL_ADDREF宏来增加了引用计数器.所以helloval->refcount++.而且这时候还通过zend_hash_add向活动符号表增加了一个符号名称为b的符号.所以这样就可以把内存使用减到最少.
我们可以通过使用PHP的内置函数memory_get_usage()来验证一下.代码如下:
[php]
$m1 = memory_get_usage();
$a = 1;
$m2 = memory_get_usage();
$b = $a;
$m3 = memory_get_usage();
echo $m2 - $m1 , "
", $m3 - $m2;
?>[/php]

实验证明我们的说法是对的!

那么$b什么时候才可以变成真正的变量呢? 我们可以使用把$b赋值一个新的值:
[php]
$a = 1;
$b = $a;
$b = 2;
?>[/php]
这样就可以在内存里分配新的空间了!
相关TAG标签
上一篇:开始了解 PHP V5 中的对象
下一篇:vim下高亮显示php代码
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站