首先是内存泄露试验,下面直接引用PHP Manual中的实验代码和试验结果图:
- <?php
- class Foo
- {
- public $var = '3.1415962654';
- }
-
- $baseMemory = memory_get_usage();
-
- for ( $i = 0; $i <= 100000; $i++ )
- {
- $a = new Foo;
- $a->self = $a;
- if ( $i % 500 === 0 )
- {
- echo sprintf( '%8d: ', $i ), memory_get_usage() - $baseMemory, "\n";
- }
- }
- ?>

可以看到在可能引发累积性内存泄露的场景下,PHP5.2发生持续累积性内存泄露,而PHP5.3则总能将内存泄露控制在一个阈值以下(与根缓冲区大小有关)。
另外是关于性能方面的对比:
- <?php
- class Foo
- {
- public $var = '3.1415962654';
- }
-
- for ( $i = 0; $i <= 1000000; $i++ )
- {
- $a = new Foo;
- $a->self = $a;
- }
-
- echo memory_get_peak_usage(), "\n";
- ?>
这个脚本执行1000000次循环,使得延迟时间足够进行对比。
然后使用CLI方式分别在打开内存回收和关闭内存回收的的情况下运行此脚本:
- time php -dzend.enable_gc=0 -dmemory_limit=-1 -n example2.php
- # and
- time php -dzend.enable_gc=1 -dmemory_limit=-1 -n example2.php
在我的机器环境下,运行时间分别为6.4s和7.2s,可以看到PHP5.3的垃圾回收机制会慢一些,但是影响并不大。
与垃圾回收算法相关的PHP配置
可以通过修改php.ini中的zend.enable_gc来打开或关闭PHP的垃圾回收机制,也可以通过调用gc_enable()或gc_disable()打开或关闭PHP的垃圾回收机制。在PHP5.3中即使关闭了垃圾回收机制,PHP仍然会记录可能根到根缓冲区,只是当根缓冲区满额时,PHP不会自动运行垃圾回收,当然,任何时候您都可以通过手工调用gc_collect_cycles()函数强制执行内存回收。
(责任编辑:admin) |