PHP bellek sızıntısı ve çatal

3 Cevap php

Ben PHP bellek sızıntısı önlemek için çalışıyorum. Ben sonunda bir nesne ve unset oluşturduğunuzda hala bellekte bulunuyor. Unset görünüyor gibi:

$obj = NULL;
unset($obj);

Yine de bu yardımcı olmaz.

My question is what will happen when I fork the proccess and the object will be created and destructed in the child thread? Will this be the same? Or is there any other way how the free the memory?

Bu ram kaç konser tüketecektir ithalat yazısıdır.

3 Cevap

PHP 5.3 döngüsel başvuruları toplamak bir çöp toplayıcı vardır. Bu denemek için değer olabilir:

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

Çıktı:

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

unset() üzerine çağırmadan önce NULL değişkeni ayarlamak gerek yok. Ancak unset () zorlamaz bellek serbest gerektiğini unutmayın. Eğer kontrol etmek isteyebilirsiniz ana şey nesne it verilerin büyük parçalar için bunu yoketmek önce olan herhangi bir referans temizler olmasıdır.

sıra ithalat komut ilk etapta ram bir kaç konser kullanmamalısınız. bunu kesinlikle gerekmez zaman başka bir yerde (dosya sistemi veya DB) veri büyük parçalar saklamak için deneyin. Ayrıca büyük bir bellek tüketimini TradeOff olacak bu şekilde işlemek için daha uzun sürer bile değil, tüm büyük bir öbekte, bir seferde küçük kısımların ithal, ama düşünün.

Bu belgelenmiş, wel bilinen davranış olarak ne Your'e hakkında konuşurken, bir bellek sızıntısı değildir. MathieuK dediği gibi, PHP5.3 içinde bazı gc * işlevleri kullanabilirsiniz ama asla onları test ettik. PHP bir dağıtımdan sonra, ayrılan bellek tekrar free'd asla çünkü bunu yoketmek bile (bu ayrılan bellek yeniden alacak çünkü, ve, verilerin geçici olarak büyük parçalar işlemek için kullanmak için oldukça kötü bir dildir Bir web sayfası iyi bir şey, ama bir büyük "Hardcore" Senaryoda iyi bir şey değil ..).