Warum Var_dump töten eine Lehre Objekte mein Apache?
Frage
Ich habe ein sehr seltsames Problem, wenn ich versuche, (oder var_dump
) print_r
eine Lehre Objekt, meine Apache-Antworten mit einer leeren leeren Seite (200 OK-Header). Ich kann einen normalen php var var_dump
wie:
$dummy = array("a" => 1, "b" =>2);
Und es funktioniert gut. Aber ich kann nicht mit einem Objekt aus jeder Lehreklasse, (wie ein Ergebnis von $connection->query()
oder einer Instanz einer Klasse von meinem Objektmodell mit Lehre).
Jeder weiß, warum dies geschieht?
Lösung
Ich habe manchmal hatte, dass beim Versuch, ein sich selbst verweisende Objekt print_r()
- es wird in eine Schleife und läuft aus dem Speicher. Möglicherweise das ist, was mit Ihnen geschieht.
Versuchen Sie, die Speichergrenze zu erhöhen (ini_set('memory_limit', '256M');
) und sehen, ob es das behebt.
Edit: Ich glaube nicht, dass es für diese ein tatsächliches fix ist - es PHP internen var_dump
/ print_r
ist, die keine Tiefe auf Rekursion begrenzen (oder Sie es nicht richtig machen, zumindest). Wenn Sie die XDebug Erweiterung, kann dies die eingebauten in var_dump
mit einer Version ersetzen, die Rekursion viel besser behandelt.
Andere Tipps
Lazy Load-Proxies immer eine Instanz Lehre der EntityManager enthalten und alle seine Abhängigkeiten.
Daher ist ein var_dump
wird möglicherweise eine sehr große rekursive Struktur-Dump, die unmöglich zu machen und zu lesen. Sie haben \Doctrine\Common\Util\Debug::dump()
zu verwenden, um das Dumping zu einer für Menschen lesbaren Ebene zu beschränken. Beachten Sie, dass für diese Funktion die Standardtiefe auf 2 gesetzt ist (es ist der zweite Parameter)
Mit der toArray
Methode der Doctrine_Record
Klasse
var_dump($doctrine_record->toArray());
wird nur die DB-Felder angezeigt werden und vermeiden Sie die vollständige Lehre Interna Dumping (enthält Selbstreferenz / Rekursion btw)
Sie können toArray verwenden, wenn Sie das Objekt sicher sind, eine Instanz von Doctrine_Collection ist. Xdebug nicht mit Lehre Aufzeichnungen helfen.
So wie ich vorschlagen, ist eine benutzerdefinierte rekursive Funktion implementierende Objekt zu drucken, die Doctrine_Record :: toArray () verwenden, wenn neeeded
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
}
}
}
Einige rekursive Funktion zu debuggen mit max Schachtelungsebenen sind hier
http://php.net/manual/en/function.var- dump.php
Schauen Sie sich die Kommentare, suchen Sie nach "Rekursion"