PHP内存泄漏和fork

PHP内存泄漏和fork,php,memory-leaks,Php,Memory Leaks,我试图避免PHP中的内存泄漏。当我创建一个对象并在最后取消设置它时,它仍然在内存中。unset看起来像: $obj = NULL; unset($obj); 但这也无济于事 我的问题是,当我分叉进程,并且在子线程中创建和销毁对象时,会发生什么?这是一样的吗? 或者有没有其他方法可以释放内存 这是一个导入脚本,它将消耗很少的内存。在调用unset()之前,无需将变量设置为NULL。但是请注意,unset()并不强制释放内存。您可能需要检查的主要内容是,在取消设置对象之前,对象会清除它对大块数据的

我试图避免PHP中的内存泄漏。当我创建一个对象并在最后取消设置它时,它仍然在内存中。unset看起来像:

$obj = NULL;
unset($obj);
但这也无济于事

我的问题是,当我分叉进程,并且在子线程中创建和销毁对象时,会发生什么?这是一样的吗? 或者有没有其他方法可以释放内存


这是一个导入脚本,它将消耗很少的内存。

在调用
unset()
之前,无需将变量设置为NULL。但是请注意,unset()并不强制释放内存。您可能需要检查的主要内容是,在取消设置对象之前,对象会清除它对大块数据的所有引用。

PHP5.3有一个垃圾收集器,可以收集循环引用。也许值得一试:

gc_enable();

class A {
  public function __construct() {
    $this->data = str_repeat("A", 1024000);
  }
}

$mem = memory_get_usage();
$a = new A();
$mem2 = memory_get_usage();
$a->a = $a;
$a->a->mydata =  $a->data . 'test';
$mem3 = memory_get_usage();
unset($a);
gc_collect_cycles();
$mem4 = memory_get_usage();      

printf("MEM 1 at start %0.2f Mb\n", ($mem / 1024) / 1024);
printf("MEM 2 after first instantiation %0.2f Mb\n", ($mem2 / 1024) / 1024);
printf("MEM 3 after self-ref: %0.2f Mb\n", ($mem3 / 1024) / 1024);
printf("MEM 4 after unset(\$a): %0.2f Mb\n", ($mem4 / 1024) / 1024);      
输出:

MEM 1 at start: 0.31 Mb
MEM 2 after first instantiation: 1.29 Mb
MEM 3 after self-ref: 2.26 Mb
MEM 4 after unset($a): 0.31 Mb   

嗯,您的导入脚本首先不应该使用少量的ram。当您不完全需要时,尝试将大块数据存储在另一个位置(文件系统或数据库)。还可以考虑一次导入较小的部分,而不是全部导入到一个大的块中,即使它需要更长的时间来处理,但这样可以权衡大内存消耗

你所说的不是内存泄漏,因为这是一种有记录的、众所周知的行为。正如MathieuK所说,在PHP5.3中,您可以使用一些gc*函数,但我从未测试过它们。PHP是一种用于处理临时大数据块的非常糟糕的语言,因为在分配之后,分配的内存将永远不会被释放,即使您取消设置它(这是因为分配的内存将被重用,这在网页中是一件好事,但在大型“硬核”脚本中不是一件好事)