Ne PHP'nin dairesel referans sorunun ölçeği ve ben bu konuda endişe gerekir?

4 Cevap php

If I am using a tree structure of nodes similar to the code below, do I have to worry about the circular reference?
I have read that PHP uses a memory allocation mechanism which can make life very hard for the garbage collector when there are circular references involved.

Ne bilmek istiyorum:

  • Benim ağacım sadece bir kaç düğüm oluşuyorsa, 25 söylüyorlar, bu bir sorun mu?
  • Bellek yazısının sonunda serbest kalacak ya da ben yavaş yavaş sunucu için bir sorun yaratıyor ki?
  • Hangi şartlar altında bu sorunun komut dosyası yürütme sırasında bir etkisi olacaktır?
  • El referanslar sorunu çözmek ve ben her zaman bunu yapmalıyım yok olacak?
class Node {
    private $parent;
    private $children;

    function addChild( Node $child ) {
        $this->children[] = $child;
        $child->setParent( $this );
    }

    function setParent( $parent ) {
        $this->parent = $parent;
    }
}

//eg
$node0 = new Node;
$node1 = new Node;

// nodes 1 and 2 have a circular reference to each other
$node0->addChild( $node1 );

4 Cevap

Nokta nokta:

  • Benim ağacım sadece bir kaç düğüm oluşuyorsa, 25 söylüyorlar, bu bir sorun mu?

Lütfen düğümler gerçek canavarlar değil sürece.

  • Bellek yazısının sonunda serbest kalacak ya da ben yavaş yavaş sunucu için bir sorun yaratıyor ki?

Tercüman kapatıldığında tüm bellek serbest bırakılır.

  • Hangi şartlar altında bu sorunun komut dosyası yürütme sırasında bir etkisi olacaktır?

Seni çok düşük bellek sınırlarını ya da çok geniş bir dinamik veri yapıları olmadığı sürece endişelenecek bir şey olacaktır şüphesiz. Eğer oluşturulan değil 25 düğümleri / kurtulmuş varsa sık sık bir sorun olmaz.

  • El referanslar sorunu çözmek ve ben her zaman bunu yapmalıyım yok olacak?

Bu yardımcı olacaktır. Uskur ile veritabanına geniş bir veri seti yüklerken biz serbest olmamak döngüsel başvurular için izlenen bellek tüketimi ile sorun bir çok koştu. Bizim çözüm tüm başvuruları temizlenmiş bir yöntemi çağırmak oldu.

(Önbelleklediğiniz sürece) her isteği sonunda tüm nesneleri dışarı atar beri Belki öyle, ama ben çok PHP programcıları bu konuda endişe sanmıyorum.

PHP komut satırı dosyaları yazıyorsanız, o zaman belki bu konuda endişe için bir dava var, ama bunu dert değer bir şey haline gelmeden önce bazı oldukça kıvrık PHP kodu yazılı olması gerekiyor. Ve bu büyük sorunları var durumda eğer.

İyi şanslar.

Çoğu PHP sayfaları doğası göz önüne alındığında - ki, süreç bir web sayfası için çalışır ve bitiminde atılır - Ben doğrusu bu bir sorun olduğunu sanmıyorum. Ben daha önce döngüsel başvurular ile sorun görmedim ve sorunsuz bir şekilde kullandık. Benim durumumda, sadece bellek tüketimi ancak PHP 5 biraz sadece kopyalama nesneler ve diziler uzak kaydırarak aksi söylenmedikçe olduğunu azaltmıştır ile daha fazla sorun haline çalışır.

PHP 5.3 dairesel referans algılama ve yıkım özellikleri içerecektir. Bu isteğe bağlı bir ayardır ve gerektiğinde çöp toplayıcı bir performans darbe vuracaktır çünkü sadece kullanılması gerektiğini, ancak sizin örneğin terzi bulunuyor.

, Şimdi geliştirin () yöntemi, bir __ imha içinde açıkça KQUEUE önlem almak, ve 5.3 mümkün yükseltin.