Vazamento de memory PHP e garfo

Estou tentando evitar o memory leaks em PHP. Quando crio um object e o desmarque no final, ele ainda está na memory. O desabrigado parece:

$obj = NULL; unset($obj); 

Ainda assim, isso não ajudará.

Minha pergunta é o que acontecerá quando forch o processo e o object será criado e destruído no thread filho? Isso será o mesmo? Ou existe de outra maneira como a memory livre?

Este é o script de importação que consumirá alguns shows de ram.

O PHP 5.3 possui um coletor de lixo que pode coletar referências cíclicas. Pode valer a pena tentar:

 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); 

Saída:

 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 

Não é necessário definir a variável como NULL antes de chamar unset() nela. Observe no entanto que unset () não força a memory a ser liberada. A principal coisa que você deseja verificar é que seu object limpa todas as referências que tem para grandes trocas de dados antes de desarmá-lo.

Bem, seu script de importação não deve usar alguns shows de ram em primeiro lugar. tente armazenar os grandes pedaços de dados em outro local (sistema de arquivos ou DB) quando você não precisa absolutamente disso. Pense também em importar seções menores ao mesmo tempo, não todas em um grande pedaço, mesmo que demore mais a processar, mas dessa forma você trocará o grande consumo de memory.

O que você está falando não é um memory leaks, pois este é um comportamento conhecido e bem conhecido. Como disse MathieuK, no PHP5.3 você pode usar algumas funções gc *, mas nunca as testei. O PHP é um idioma muito ruim para usar para lidar com grandes quantidades temporárias de dados, porque depois de uma alocação, a memory alocada nunca será liberada novamente, mesmo que você desmarque-a (porque a memory alocada será reutilizada, e isso é uma coisa boa em uma página da web, mas não é uma coisa boa em um grande script “hardcore” …).

Intereting Posts