Perché var_dump a Doctrine Objects uccide il mio Apache?
Domanda
Ho un problema molto strano, quando provo a var_dump
(o print_r
) un oggetto Doctrine, il mio Apache risponde con una pagina vuota vuota (200 OK header) . Posso var_dump
un normale var php come:
$dummy = array("a" => 1, "b" =>2);
E funziona benissimo. Ma non posso con nessun oggetto di qualsiasi classe Doctrine, (come un risultato di $ connection- > query ()
, o un'istanza di una classe del mio modello a oggetti con Doctrine).
Qualcuno sa perché questo accada?
Soluzione
Qualche volta l'ho provato quando ho provato a print_r ()
un oggetto autoreferenziale - entra in un ciclo ed esaurisce la memoria. Forse è quello che ti sta succedendo.
Prova ad aumentare il limite di memoria ( ini_set ('memory_limit', '256M');
) e vedi se questo lo risolve.
Modifica: non credo che ci sia una soluzione effettiva per questo - è il var_dump
/ print_r
interno di PHP che non limita la profondità della ricorsione (o no fallo correttamente, almeno). Se si installa l'estensione XDebug , è possibile sostituire l'estensione var_dump
con una versione che gestisce molto meglio la ricorsione.
Altri suggerimenti
I proxy di caricamento lento contengono sempre un'istanza di EntityManager di Doctrine e tutte le sue dipendenze.
Pertanto un var_dump
probabilmente scaricherà una struttura ricorsiva molto grande che è impossibile renderizzare e leggere. Devi usare \ Doctrine \ Common \ Util \ Debug :: dump ()
per limitare il dumping a un livello leggibile dall'uomo. Si noti che la profondità predefinita per questa funzione è impostata su 2 (è il secondo parametro)
Utilizza il metodo toArray
della classe Doctrine_Record
var_dump($doctrine_record->toArray());
visualizzerà solo i campi DB ed eviterà di scaricare l'intero interno di Doctrine (che contiene autoreferenziazione / ricorsione tra l'altro)
Puoi usare toArray se sei sicuro che l'oggetto sia un'istanza di Doctrine_Collection. Xdebug non aiuta con i record di dottrina.
Il modo in cui suggerisco è l'implementazione di una funzione ricorsiva personalizzata per stampare l'oggetto, che utilizza Doctrine_Record :: toArray () quando necessario
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
}
}
}
Alcune funzioni ricorsive per il debug con livelli massimi di annidamento sono qui
http://php.net/manual/en/function.var- dump.php
Guarda i commenti, cerca " ricorsione "