Ico*_*ood 16 php performance garbage-collection drupal
我有一个在cron上运行的PHP脚本,可能需要15分钟才能执行.我定期吐出memory_get_usage()所以我可以看到发生了什么.它第一次告诉我我的用法我是10兆.当脚本完成时,我的速度为114兆!
PHP是否在脚本运行时执行垃圾收集?或者那些记忆发生了什么?有什么我可以做的强制垃圾收集.我的脚本正在执行的任务是每晚将几千个节点导入Drupal.所以很多时候它也在做同样的事情.
有什么建议?
Art*_*cto 16
关键是,一旦不需要全局变量,就可以取消它们.
您不需要为局部变量和对象属性显式调用unset,因为当函数超出范围或对象被销毁时会销毁它们.
PHP保留所有变量的引用计数,并在此引用计数变为零时立即销毁它们(在大多数条件下).对象有一个内部引用计数,变量本身(对象引用)每个都有一个引用计数.当所有对象引用因为引用coutns命中0而被销毁时,对象本身将被销毁.例:
$a = new stdclass; //$a zval refcount 1, object refcount 1
$b = $a; //$a/$b zval refcount 2, object refcount 1
//this forces the zval separation because $b isn't part of the reference set:
$c = &$a; //$a/$c zval refcount 2 (isref), $b 1, object refcount 2
unset($c); //$a zval refcount 1, $b 1, object refcount 2
unset($a); //$b refcount 1, object refcount 1
unset($b); //everything is destroyed
Run Code Online (Sandbox Code Playgroud)
但请考虑以下情形:
class A {
public $b;
}
class B {
public $a;
}
$a = new A;
$b = new B;
$a->b = $b;
$b->a = $a;
unset($a); //cannot destroy object $a because $b still references it
unset($b); //cannot destroy object $b because $a still references it
Run Code Online (Sandbox Code Playgroud)
这些循环引用是PHP 5.3的垃圾收集器启动的地方.您可以使用显式调用垃圾收集器gc_collect_cycles.