Neden Doktrin nesneler benim Apache öldürmek var_dump?

4 Cevap php

I var_dump (veya print_r), bir Doktrin nesne, boş boş sayfa (200 OK başlık) ile benim Apache yanıtları denediğimde, çok garip bir sorun var. I can var_dump normal php var gibi:

$dummy = array("a" => 1, "b" =>2);

Ve gayet iyi çalışıyor. Ama olamaz (Doktrini ile benim nesne modeli $connection->query() bir sonucu gibi, ya da bir sınıfın bir örneğine) herhangi Doktrin sınıf, herhangi bir nesne ile.

Bu durumda neden kimse bilmiyor?

4 Cevap

Bu bir döngü içine alır ve bellek biterse - I print_r() kendi kendine referans nesneye çalışırken bazen yaşadım. Muhtemelen bu sizin için neler var.

Bellek sınırı (ini_set('memory_limit', '256M');) artırmayı deneyin ve o giderir görmek.

Düzenleme: Ben bunun için gerçek bir düzeltme var sanmıyorum - bu PHP'nin dahili var_dump / print_r özyinelemenin üzerinde derinlik sınırı yok (ya da, düzgün bunu yapmayın az). Eğer XDebug uzantı yüklerseniz, bu çok daha iyi özyinelemeye kolları bir sürümü ile yerleşik var_dump değiştirebilirsiniz.

Tembel yük vekiller her zaman Doktrini adlı EntityManager ve tüm bağımlılıkları bir örneğini içerir.

Bu nedenle var_dump belki işlemek ve okumak imkansız çok büyük bir özyinelemeli yapısı dökümü. Sen \Doctrine\Common\Util\Debug::dump() bir insan okunabilir seviyeye damping kısıtlamak için kullanmak zorunda. Bu fonksiyon için varsayılan derinlik (bu ikinci parametre bulunuyor) 2 ayarlandığını unutmayın

Doctrine_Record sınıfının toArray yöntemini kullanın

var_dump($doctrine_record->toArray());

sadece DB alanlarını görüntülemek ve (btw kendine referans / özyinelemeye içerir) tam Doktrini internals damping önlemek olacaktır

You can use toArray if you are sure the object is an instance of Doctrine_Collection. Xdebug does not help with doctrine records.

Neeeded zaman önermek yolu) nesne yazdırmak için özel bir özyinelemeli işlev uygulama, Doctrine_Record :: ToArray (kullanmak olmasıdır

function var_dump_improved()
{
   foreach (func_get_args() as $arg) {
       if ($args instanceof Doctrine_Collection) {
          print_r($arg);
       } else if ( $arg instanceof Traversable || is_array($arg) ) {
          // do a foreach and recall var_dump_improved on subelements
       } else if (...) {
          // other types
       } 
   }   
}

Max yuvalama seviyeleri ile hata ayıklama Bazı özyinelemeli fonksiyon burada

http://php.net/manual/en/function.var-dump.php

"Özyineleme" için bakmak, yorumlarına bakın