<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/podcast2.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/80islandtomisongsblog" type="application/rss+xml" ref="self"></atom:link><fs:self_link href="http://feed.feedsky.com/80islandtomisongsblog" type="application/rss+xml"></fs:self_link><lastBuildDate>Sun, 18 May 2008 10:55:33 GMT</lastBuildDate><title>80island-tomisong's blog</title><description>tomisong's blog Feed</description><image><url>http://www.feedsky.com/images/feedsky_logologo.gif</url><title>80island-tomisong's blog</title><link>http://www.80island.com</link></image><link>http://www.80island.com</link><pubDate>Mon, 02 Jun 2008 23:13:25 GMT</pubDate><dc:date>2008-06-02T23:13:25Z</dc:date><item><title>为什么不敢看温总理的眼睛</title><link>http://item.feedsky.com/~feedsky/80islandtomisongsblog/~7029345/80506402/5137305/1/item.html</link><description>2008年5月12日14点28分，中国四川汶川突发7.8级大地震。余震没停止、时间没静止，中华民族在与时间赛跑&amp;hellip;&amp;hellip;。 &lt;br /&gt;
&lt;br /&gt;
　　为什么我不敢看总理的眼睛， &lt;br /&gt;
　　因为那里面的信息让我心疼！ &lt;br /&gt;
&lt;br /&gt;
　　早一分钟，就可多救一个生命， &lt;br /&gt;
　　早一分钟，就可多救一个家庭。 &lt;br /&gt;
　　救人、救人、还是救人！ &lt;br /&gt;
　　第一时间，温总理飞到了巴山， &lt;br /&gt;
　　第一时间，向全国发出了命令， &lt;br /&gt;
　　&amp;mdash;&amp;mdash;这也是人民的命令！ &lt;br /&gt;
　　武警、陆军、空军、海军&amp;hellip;&amp;hellip; &lt;br /&gt;
　　2万、5万、10万&amp;hellip;&amp;hellip; &lt;br /&gt;
　　无奈，地崩山摧蜀道断， &lt;br /&gt;
　　无奈，天昏雨暗10万大军路难行。 &lt;br /&gt;
　　雨再大，也要行， &lt;br /&gt;
　　蜀道再难，也要行， &lt;br /&gt;
　　因为我们的部队是人民子弟兵！ &lt;br /&gt;
　　早一分钟，就可多救一个生命， &lt;br /&gt;
　　早一分钟，就可多救一个家庭。 &lt;br /&gt;
　　但人有情天无情， &lt;br /&gt;
　　巴山蜀道更无情。 &lt;br /&gt;
　　这里不是荆江大堤， &lt;br /&gt;
　　这里不是京广铁路。 &lt;br /&gt;
　　共和国总理可令三军推进， &lt;br /&gt;
　　却不能喝令 &lt;br /&gt;
　　巴山让路、 &lt;br /&gt;
　　蜀道畅通。 &lt;br /&gt;
　　&amp;ldquo;黄金时间&amp;rdquo;在一分钟、一分钟流失， &lt;br /&gt;
　　死神在吞噬一个、又一个废墟下的生命&amp;hellip;&amp;hellip;。 &lt;br /&gt;
　　心急如焚、 &lt;br /&gt;
　　心急如绞。 &lt;br /&gt;
　　但作为总理您要镇定、 &lt;br /&gt;
　　您要理性， &lt;br /&gt;
　　镇定，才能给人信心， &lt;br /&gt;
　　理性，才能指挥若定。 &lt;br /&gt;
　　&amp;ldquo;同胞们，要坚强， &lt;br /&gt;
　　乡亲们，要挺住。&amp;rdquo; &lt;br /&gt;
　　从汶川到北川， &lt;br /&gt;
　　哪里是重灾区， &lt;br /&gt;
　　那里的废墟前， &lt;br /&gt;
　　就会出现您的身影。 &lt;br /&gt;
　　但，这只是灾区的一角。 &lt;br /&gt;
　　当您从废墟前站起身， &lt;br /&gt;
　　锁眉远眺时， &lt;br /&gt;
　　肯定听到了， &lt;br /&gt;
　　十万公里大山深处 &lt;br /&gt;
　　废墟下的呻吟声。 &lt;br /&gt;
　　您恨不得分身有术， &lt;br /&gt;
　　化做千万个温家宝， &lt;br /&gt;
　　亲自走到每一处废墟前， &lt;br /&gt;
　　俯身安慰幸存者： &lt;br /&gt;
　　&amp;ldquo;老人家，我是温家宝， &lt;br /&gt;
　　小朋友，我是温爷爷， &lt;br /&gt;
　　再坚持一会， &lt;br /&gt;
　　救援人员马上就到&amp;hellip;&amp;hellip;&amp;rdquo;。 &lt;br /&gt;
　　当您从废墟前站起身， &lt;br /&gt;
　　锁眉远眺时， &lt;br /&gt;
　　我们看到了， &lt;br /&gt;
　　一位年逾花甲的老人， &lt;br /&gt;
　　焦急、内疚、悲痛， &lt;br /&gt;
　　欲愤无语， &lt;br /&gt;
　　欲泣不能。 &lt;br /&gt;
　　作为共和国总理， &lt;br /&gt;
　　您可再令三军推进， &lt;br /&gt;
　　但巴山仍不让路、 &lt;br /&gt;
　　蜀道依然难通&amp;hellip;&amp;hellip;。 &lt;br /&gt;
　　敬爱的温总理， &lt;br /&gt;
　　您说了什么， &lt;br /&gt;
　　我们听到了； &lt;br /&gt;
　　您眼睛说了什么， &lt;br /&gt;
　　我们更听懂了。 &lt;br /&gt;
　　为什么我不敢看温总理的眼睛， &lt;br /&gt;
　　因为那里面的信息让我心疼！ &lt;br /&gt;
　　为什么我不敢看温总理的眼睛， &lt;br /&gt;
　　因为那里面装着汶川儿女的疼、 &lt;br /&gt;
　　四川父老的疼、 &lt;br /&gt;
　　中华民族的疼！ &lt;br /&gt;
　　&amp;ldquo;苟利国家生死以， &lt;br /&gt;
　　岂因祸福避趋之&amp;rdquo;， &lt;br /&gt;
　　这是温总理对国民的至爱大疼！ &lt;br /&gt;
　　此时无声胜有声， &lt;br /&gt;
　　此刻没有命令胜过命令。 &lt;br /&gt;
　　此时此刻我们都是汶川人、四川人， &lt;br /&gt;
　　我们亲情相连、血脉相通。 &lt;br /&gt;
　　让我们用眼睛安慰眼睛， &lt;br /&gt;
　　用心灵抚慰心灵， &lt;br /&gt;
　　用行动支持行动， &lt;br /&gt;
　　分担总理的疼， &lt;br /&gt;
　　分担灾区人民的疼。 &lt;br /&gt;
　　在献血站、在捐款箱前， &lt;br /&gt;
　　我们含泪默默排起了长龙&amp;hellip;&amp;hellip;。 &lt;br /&gt;
　　苍天无情人有情， &lt;br /&gt;
　　地震无情，中华儿女有情。 &lt;br /&gt;
　　天灾洗礼，不改巴蜀美丽， &lt;br /&gt;
　　沧海横流，更显华夏英雄。 &lt;br /&gt;
　　我们落泪、我们悲痛， &lt;br /&gt;
　　但我们也欣慰、我们也自豪： &lt;br /&gt;
　　因为我们都是中国人， &lt;br /&gt;
　　因为我们有这样的总理、 &lt;br /&gt;
　　这样的子弟兵、 &lt;br /&gt;
　　这样的好同胞， &lt;br /&gt;
　　因为我们有千千万万双这样满溢大爱的眼睛！ &lt;br /&gt;
&lt;br /&gt;</description><pubDate>Sun, 18 May 2008 18:55:33 +0800</pubDate><guid isPermaLink="false">http://www.80island.com/articles/view/70</guid><fs:srclink>http://www.80island.com/articles/view/70</fs:srclink><fs:srcfeed>http://www.80island.com/rss/Article</fs:srcfeed><fs:itemid>feedsky/80islandtomisongsblog/~7029345/80506402/5137305</fs:itemid></item><item><title>最近忙，没时间更新了！</title><link>http://item.feedsky.com/~feedsky/80islandtomisongsblog/~7029345/80506403/5137305/1/item.html</link><description>&lt;font face=&quot;Arial&quot;&gt;最近忙，没时间更新了！&lt;/font&gt;</description><pubDate>Sat, 17 May 2008 05:44:23 +0800</pubDate><guid isPermaLink="false">http://www.80island.com/articles/view/69</guid><fs:srclink>http://www.80island.com/articles/view/69</fs:srclink><fs:srcfeed>http://www.80island.com/rss/Article</fs:srcfeed><fs:itemid>feedsky/80islandtomisongsblog/~7029345/80506403/5137305</fs:itemid></item><item><title>PHP对象相互引用的内存溢出</title><link>http://item.feedsky.com/~feedsky/80islandtomisongsblog/~7029345/80506404/5137305/1/item.html</link><description>&lt;p&gt;使用脚本语言最大的好处之一就是可利用其拥有的自动垃圾回收机制（释放内存）。你不需要在使用完变量后做任何释放内存的处理，&lt;a onclick=&quot;javascript:tagshow(event, 'PHP');&quot; target=&quot;_self&quot; href=&quot;javascript:;&quot;&gt;&lt;u&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;会帮你完成。&lt;br /&gt;
当然，我们可以按自己的意愿调用 unset() 函数来释放内存，但通常不需要这么做。&lt;br /&gt;
不过在PHP里，至少有一种情况内存不会得到自动释放，即便是手动调用 unset()。详情可考：&lt;a href=&quot;http://bugs.php.net/bug.php?id=33595&quot;&gt;http://bugs.php.net/bug.php?id=33595&lt;/a&gt;。 &lt;/p&gt;
&lt;h3&gt;问题症状 &lt;/h3&gt;
&lt;p&gt;如果两个&lt;a onclick=&quot;javascript:tagshow(event, '%B6%D4%CF%F3');&quot; target=&quot;_self&quot; href=&quot;javascript:;&quot;&gt;&lt;u&gt;&lt;strong&gt;对象&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;之间存在着相互引用的关系，如&amp;ldquo;父对象-子对象&amp;rdquo;，对父对象调用 unset() &lt;strong&gt;不会&lt;/strong&gt;释放在子对象中引用父对象的内存（即便父对象被垃圾回收，也不行）。 &lt;br /&gt;
有些糊涂了？我们来看下面的这段&lt;a onclick=&quot;javascript:tagshow(event, '%B4%FA%C2%EB');&quot; target=&quot;_self&quot; href=&quot;javascript:;&quot;&gt;&lt;u&gt;&lt;strong&gt;代码&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;： &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;class Foo {&lt;br /&gt;    function __construct()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;bar = new Bar($this);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Bar {&lt;br /&gt;    function __construct($foo = null)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;foo = $foo;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;while (true) {&lt;br /&gt;    $foo = new Foo();&lt;br /&gt;    unset($foo);&lt;br /&gt;    echo number_format(memory_get_usage()) . &amp;quot;\n&amp;quot;;&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行这段代码，你会看到内存使用率越来越高越来越高，直到用光光。 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...&lt;br /&gt;33,551,616&lt;br /&gt;33,551,976&lt;br /&gt;33,552,336&lt;br /&gt;33,552,696&lt;br /&gt;PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted&lt;br /&gt;(tried to allocate 16 bytes) in memleak.php on line 17&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对大部分PHP程序员来讲这种情况不算是什么问题。&lt;br /&gt;
可如果你在一个长期运行的代码中使用到了一大堆相互引用的对象，尤其是在对象相对较大的情况下，内存会迅速地消耗殆尽。&lt;/p&gt;
&lt;h3&gt;Userland解决方案 &lt;/h3&gt;
&lt;p&gt;虽然有些乏味、不优雅，但之前提到的 bugs.php.net 链接中提供了一个解决方案。&lt;br /&gt;
这个方案在释放对象前使用一个 destructor &lt;a onclick=&quot;javascript:tagshow(event, '%B7%BD%B7%A8');&quot; target=&quot;_self&quot; href=&quot;javascript:;&quot;&gt;&lt;u&gt;&lt;strong&gt;方法&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;以达到目的。Destructor 方法可将所有内部的父对象引用全部清除，也就是说可以将这部分本来会溢出的内存释放掉。 &lt;br /&gt;
以下是&amp;ldquo;修复后&amp;rdquo;的代码： &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;class Foo {&lt;br /&gt;    function __construct()&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;bar = new Bar($this);&lt;br /&gt;    }&lt;br /&gt;    function __destruct()&lt;br /&gt;    {&lt;br /&gt;        unset($this-&amp;gt;bar);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Bar {&lt;br /&gt;    function __construct($foo = null)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;foo = $foo;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;while (true) {&lt;br /&gt;    $foo = new Foo();&lt;br /&gt;    $foo-&amp;gt;__destruct();&lt;br /&gt;    unset($foo);&lt;br /&gt;    echo number_format(memory_get_usage()) . &amp;quot;\n&amp;quot;;&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意那个新增的 &lt;code&gt;&lt;font face=&quot;NSimsun&quot;&gt;Foo::__destruct()方法，以及在释放对象前对 $foo-&amp;gt;__destruct() 的调用。现在这段代码解决了内存使用率一直增加的问题，这么一来,代码就可以很好的&lt;a onclick=&quot;javascript:tagshow(event, '%B9%A4%D7%F7');&quot; target=&quot;_self&quot; href=&quot;javascript:;&quot;&gt;&lt;u&gt;&lt;strong&gt;工作&lt;/strong&gt;&lt;/u&gt;&lt;/a&gt;了。&lt;/font&gt;&lt;/code&gt; &lt;/p&gt;
&lt;h3&gt;PHP内核解决方案？ &lt;/h3&gt;
&lt;p&gt;为什么会有内存溢出的发生？我对PHP内核方面的研究并不精通，但可以确定的是此问题与引用计数有关系。&lt;br /&gt;
在 $bar 中引用 $foo 的引用计数不会因为父对象 $foo 被释放而递减，这时PHP认为你仍需要 $foo 对象，也就不会释放这部分的内存&amp;hellip;&amp;hellip;大概是这样。&lt;br /&gt;
这里确实可以看出我的无知，但大体意思是：一个引用计数没有递减，所以一些内存永远得不到释放。&lt;br /&gt;
在前面提到的 bugs.php.net 链接中我看到修改垃圾回收的过程将会牺牲极大的性能，因为我对引用计数了解不多，所以我认为这是真的。&lt;br /&gt;
与其改变垃圾回收的过程，为什么不用 unset() 对内部对象做释放的工作呢？（或者在释放对象的时候调用 __destruct()？）&lt;br /&gt;
也许PHP内核开发者可以在此或其他地方，对这种垃圾回收处理机制做出修改。 &lt;br /&gt;
更新：Martin Fjordvald 在评论中提到了一个由 David Wang 为垃圾回收所写的补丁（其实它看起来更像&amp;ldquo;一整块布&amp;rdquo;&amp;mdash;&amp;mdash;非常巨大。详情参见此邮件结尾的CVS导出信息。）确实&lt;a href=&quot;http://news.php.net/php.internals/30790&quot;&gt;存在&lt;/a&gt;（一封邮件），并受到了PHP内核开发成员的关注。问题是这个补丁要不要放到PHP5.3中并未得到&lt;a id=&quot;a_9a&quot; title=&quot;太多支持&quot; href=&quot;http://news.php.net/php.internals/32330&quot;&gt;太多支持&lt;/a&gt; 。&lt;em&gt;我觉得一个不错的折中方案就是在 unset() 函数中调用对象中的 __destruct() 方法；&lt;/em&gt;&lt;/p&gt;
&lt;div id=&quot;dictdiv&quot; style=&quot;DISPLAY: none; FONT-SIZE: 13px; Z-INDEX: 1000; BACKGROUND: yellow 0% 50%; LEFT: 0pt; MARGIN: 5px; FONT-FAMILY: arial; POSITION: absolute; TOP: 0pt; opacity: 0.9; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px; -moz-border-radius-bottomright: 5px; -moz-border-radius-bottomleft: 5px&quot;&gt;&amp;nbsp;&lt;/div&gt;</description><pubDate>Tue, 13 May 2008 20:34:07 +0800</pubDate><guid isPermaLink="false">http://www.80island.com/articles/view/68</guid><fs:srclink>http://www.80island.com/articles/view/68</fs:srclink><fs:srcfeed>http://www.80island.com/rss/Article</fs:srcfeed><fs:itemid>feedsky/80islandtomisongsblog/~7029345/80506404/5137305</fs:itemid></item></channel></rss>