Утечка и вилка памяти PHP

Я пытаюсь избежать утечки памяти в PHP. Когда я создаю объект и отключаю его в конце, он все еще находится в памяти. Сброс выглядит так:

$obj = NULL; unset($obj); 

Тем не менее это не поможет.

Мой вопрос заключается в том, что произойдет, когда я переделаю proccess, и объект будет создан и разрушен в дочернем потоке? Это будет то же самое? Или есть ли другой способ освобождения памяти?

Это сценарий импорта, который будет потреблять несколько концертов.

    PHP 5.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); с 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 

    Не нужно устанавливать переменную в NULL перед вызовом функции unset() . Обратите внимание, однако, что unset () не освобождает память. Главное, что вы можете проверить, это то, что ваш объект очищает любые ссылки, которые он имеет, перед большими фрагментами данных, прежде чем вы его отключите.

    ну, ваш сценарий импорта не должен использовать несколько концертов бара в первую очередь. попробуйте хранить большие куски данных в другом месте (файловой системе или БД), когда вы не нуждаетесь в нем. Также подумайте об импорте небольших разделов за раз, а не в одном большом куске, даже если это займет больше времени, но таким образом вы будете компенсировать большое потребление памяти.

    То, о чем вы говорите, это не утечка памяти, поскольку это документированное, хорошо известное поведение. Как сказал MathieuK, в PHP5.3 вы можете использовать некоторые функции gc *, но я их никогда не тестировал. PHP – довольно плохой язык для обработки временных больших фрагментов данных, потому что после выделения выделенная память больше никогда не будет освобождена, даже если вы ее отключите (это связано с тем, что выделенная память будет повторно использована, и это это хорошо на веб-странице, но не очень хорошо в большом «хардкорном» скрипте ..).