<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[原创]unset函数内存分配和销毁问题探秘，及PHP在运行时占用了多少内存的获取。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Fri, 19 Dec 2008 11:17:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	**rvinzhou(周*飞) 14:28:27<br/>波波&nbsp;&nbsp;请教个问题&nbsp;&nbsp;你晓得一个php请求&nbsp;&nbsp;在服务器上占用多少内存&nbsp;&nbsp;这个有办法查的吗<br/><br/>jackxiang(向东) 14:30:23<br/>$a = memory_get_usage(); Bytes为单位。<br/><br/>也就是当时 PHP 脚本使用的内存（不含 memory_get_usage() 函数本身占用的内存）<br/>由下面的例子可以看出，要想减少内存的占用，可以使用 PHP unset() 函数把不再需要使用的变量删除（下面就是测试真的销毁了没）。类似的还有：PHP mysql_free_result() 函数，可以清空不再需要的查询数据库得到的结果集，这样也能得到更多可用内存。<br/>PHP memory_get_usage()还可以有个参数，$real_usage，其值为布尔值。默认为 FALSE，表示得到的内存使用量不包括该函数（PHP 内存管理器）占用的内存；当设置为 TRUE 时，得到的内存为不包括该函数（PHP 内存管理器）占用的内存。<br/>所以在实际编程中，可以用PHP memory_get_usage()比较各个方法占用内存的高低，来选择使用哪种占用内存小的方法。<br/><br/><br/><div class="code">&lt;?php<br/>for ( $i = 1; $i &lt; 100; $i++ ) &#123;<br/>$str = str_repeat(&#039;01234567&#039;, $i);<br/>$a = memory_get_usage();<br/>unset($str);<br/>echo $str;<br/>$b = memory_get_usage();<br/>echo &quot;&#92;n&lt;br /&gt;&quot;.$i.&#039;: &#039;.($b - $a).&#039; Bytes.&#039;;<br/>&#125;<br/>?&gt;</div><br/><br/><br/><br/><div class="code">&lt;br /&gt;10: 0 Bytes.<br/>&lt;br /&gt;11: 0 Bytes.<br/>&lt;br /&gt;12: 0 Bytes.<br/>&lt;br /&gt;13: 0 Bytes.<br/>&lt;br /&gt;14: 0 Bytes.<br/>&lt;br /&gt;15: 0 Bytes.<br/>&lt;br /&gt;16: 0 Bytes.<br/>&lt;br /&gt;17: -148 Bytes.<br/>&lt;br /&gt;18: -156 Bytes.<br/>&lt;br /&gt;19: -164 Bytes.<br/>&lt;br /&gt;20: -172 Bytes.<br/>&lt;br /&gt;21: -180 Bytes</div><br/><br/>据我的了解，unset()是用来销毁指定的变量、释放内存<br/>经过以上代码的测试，变量确实没有值了，物理内存也释放了。<br/>但是我在测试的我spider程序时，电脑运行变的很慢。<br/>每一次测试后，对电脑的运行速度的影响就越大。<br/>我的spider程序中，用到了大量的unset。<br/>查看了一下物理内存的使用，spider程序运行结束后，会下降到很低，CPU使用率也下降到4%左右。<br/>实在没办法就重启了一下apache服务器，系统立刻恢复正常。<br/>再经过测试，发现每运行一次php程序（有unset操作的），虚拟内存就增加一点，运行结束后，不会下降，<br/>而且全是httpd.exe所占用的。<br/>所以我想，unset的操作，并没有销毁变量，只是把它从物理内存转移到虚拟内存了。<br/>apache服务器不停止，它也一直不释放，只增不减。<br/>这是我的个人猜想，如果有人遇到这样的问题的话，希望可以讨论一下，也希望高手指导一下。<br/>下面是测试程序：<br/>&lt;?php<br/>for ( $i = 1; $i &lt; 100000; $i++ ) &#123;<br/>$str = str_repeat(&#039;pgpgpgpgpgpg&#039;, 1000);<br/>unset($str);<br/>&#125;<br/>?&gt;<br/>ps:虚拟内存的查看可以在任务管理器中，点查看－－－选择列－－在虚拟内存上打勾<br/>这样就可以监视它们的使用情况了！<br/>但是感觉不对，你这都是在for循环内部，而且就是你unset($str)了。但$a或者$i都是占用内存空间的。<br/>PHP的垃圾回收机制相类似， 对于全局作用域的变量， unset只是告诉ZE， 这个变量可以被回收，但是具体什么时候回收，那确是有ZE决定的。 一般来说是会在RSHUTDOWN函数中进行。<br/>你的问题挺好。呵呵！<br/><br/>转载：<br/>首先要强调的一点是unset在php中已经不再是一个函数了，既然不是函数，那么就没有了返回值，所以用的时候不能够用unset的返回值来做判断。<br/>其次，在函数中，unset只能销毁局部变量，并不能销毁全局变量，来看下手册的一个例子<br/><div class="code">&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php<br/>&nbsp;&nbsp;&nbsp;&nbsp;function destroy_foo() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;global $foo;<br/>&nbsp;&nbsp;&nbsp;&nbsp;unset($foo);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;$foo = ‘bar’;<br/>&nbsp;&nbsp;&nbsp;&nbsp;destroy_foo();<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo $foo;<br/>&nbsp;&nbsp;&nbsp;&nbsp;?&gt;</div><br/>返回的结果为<br/><div class="code">&nbsp;&nbsp;&nbsp;&nbsp;bar</div><br/>为什么会这样呢？原因就是unset在函数中只能销毁局部变量。如果在程序中需要用到销毁全局变量的应该如何做呢？也很简单，用$GLOBALS数组来实现。看下面的例子：<br/><div class="code">&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php<br/>&nbsp;&nbsp;&nbsp;&nbsp;function foo() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;unset($GLOBALS&#91;&#039;bar&#039;&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;$bar = “something”;<br/>&nbsp;&nbsp;&nbsp;&nbsp;foo();<br/>&nbsp;&nbsp;&nbsp;&nbsp;var_dump($bar);<br/>&nbsp;&nbsp;&nbsp;&nbsp;?&gt;</div><br/>这样程序就会返回NULL。<br/>首先，unset不能释放占用的内存资源，你会问：<br/>如果只是打断了指针,那变量在内存中的存储不就是没有销毁?<br/>还是仅仅是引用的时候才这样?<br/>如果都这样不是很浪费资源?<br/><br/>应该不存在浪费资源一说。php也有类似java的垃圾回收机制!<br/>当给一个变量赋值（或者相类似的操作），内存会开辟一个空间存储，这时候会产生两个重要的概念，一个是“内存的地址”，一个是“地址内的内容”。<br/>unset打断了变量与地址间的联系。而php会自动检测内存地址里的数据是否完全没有跟其它变量产生联系，在确定没有的情况下会回收内存。<br/>所以要回收内存，那就要把所有的联系打断。<br/>是打断指针的，因为PHP的引用不是C语言中的指针！C语言的指针可以做到注销变量内容，只要取得内存地址的内容就可以注销变量内容了！不过PHP不行！<br/><br/>结合上面两篇文章，得出结论：对于全局的变量，我们实际是没有销毁的事实,unset其实根本没有销毁掉变量本身，估计就是通过修改地址等虚拟手段让其无法访问到而已，但要是通过它自己的内存机制还是可以访问的，我们无法了解它的内存机制，觉得是被销毁罢了。。。。
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [原创]unset函数内存分配和销毁问题探秘，及PHP在运行时占用了多少内存的获取。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>