PHP Nesne Yerleştirme / Yaratılış Limiti kaçının nasıl?

1 Cevap php

Ben bir nesne sınırı karşı darbeleme ve çökmesine neden php gibi görünüyor PHP bir el yapımı ORM var. İşte çökmelerine neden olur basit bir script var:

<?
class Bob
{
    protected $parent;  
    public function Bob($parent)
    {
        $this->parent = $parent;
    }

    public function __toString()
    {
        if($this->parent)
            return (string) "x " . $this->parent;
        return "top";
    }
}


$bobs = array();
for($i = 1; $i < 40000; $i++)
{
    $bobs[] = new Bob($bobs[$i -1]);
}    
?>

Hatta komut satırından bu çalışan sorunlara neden olur. Bazı kutuları 40.000 'den fazla nesneleri almak. Linux / appache üzerinde denedim (başarısız) ama benim app IIS / FastCGI çalışır. FastCGI bu ünlü "FastCGI işlemi beklenmedik biçimde ayrıldığı" hata neden olur.

Açıkçası 20k nesneler biraz yüksek, ama onlar veri ve iç içe karmaşıklığı varsa o kadar az nesneler çöküyor.

Hızlı CGI sorunu değil - Ben komut satırından çalışan denedim. 6.000 MB ve gerçekten düşük bir şey - - 24MB Ben gerçekten yüksek bir şey belleği ayarlama denedim. Ben yeterince düşük ayarlarsanız, ben "bitkin ayrılan bellek boyutu xxx byte" hatası alırsınız.

Yuvalama önleme çeşit - Ben denir fonksiyonların sayısı ile yapmak zorunda olduğunu düşünüyorum. Ben Orm'un yuvalama belki de karmaşık ama olduğunu olduğunu düşünmüyordu. Ben ölür sadece ONE, daha fazla nesneyi yüklemek eğer ben bazı oldukça açık durumlarda nerede var, ama bu 3 saniyenin altında yük çalışır eğer.

1 Cevap

Döngü ince çalıştıktan sonra kodu yerleştirilir - İlginçtir, benim ortamında, o nesneleri yapısızlaştırmak zamanı geldiğinde segfault oluşur görünür. PHP segfault meydana kapatma başladığında sadece bu kadar.

Sen file a bug, ancak PHP'nin bakıcılarına bu tür bir şey desteklemek için kendi yolumdan gitmeyecek bulabilirsiniz olabilir. Etkili olduğu basit dışında kullandığı ima -: "Bellek sayfadan sonra serbest hale, yani bu gerçekten önemli değil bir Wontfix" Ben resmi yanıtı aslında hangi bir bellek sızıntısı hakkında en azından bir hata raporunu gördüm hızla bir web sayfası ve sonlanan render durum gerçekten desteklenmez.

Tam zamanlı PHP gelişme 5 yıl sonra, ben basit bir kural geldi ettik: Bu PHP çöküyor, bunu yapmayın. PHP kendi sınırlamaları vardır ve bu sınırlarını zorlayan yok eğer kendinizi en başarılı bulacaksınız.

İşte create_function() PHP kaçınmak gibi şeyler demektir <= 5.2 (o deli gibi bellek sızdırıyor). Sen fonksiyonel bir dil sanki create_function() PHP kullanmak için kullanmayı deneyebilirsiniz. Bu değil, ve siz gibi kullanmaya çalışırsanız o sefil başarısız bulacaksınız.

Yani PHP yuvalama bobinleri ise 40000 seviyeleri derin değil ... yuva derin 40000 seviyelerini nesneleri yok nesneleri. Olası bir alternatif nesneler yerine diziler kullanıyor - ama hala oldukça iğrenç geliyor.