Pourquoi var_dump un objet de doctrine tue mon Apache?
Question
J'ai un problème très étrange lorsque j'essaie de var_dump
(ou print_r
) un objet de doctrine, mes réponses Apache avec une page vierge vide (en-tête 200 OK) . Je peux var_dump
une var php normale comme:
$dummy = array("a" => 1, "b" =>2);
Et ça marche bien. Mais je ne peux pas utiliser d’objet de n'importe quelle classe de Doctrine (comme un résultat de $ connection- > query ()
, ou une instance d’une classe de mon modèle d’objet avec Doctrine).
Quelqu'un sait pourquoi cela se produit?
La solution
J'ai parfois eu cela en essayant de print_r ()
un objet auto-référençant - il entre dans une boucle et manque de mémoire. C'est peut-être ce qui vous arrive.
Essayez d'augmenter la limite de mémoire ( ini_set ('memory_limit', '256M');
) et voyez si cela résout le problème.
Éditer: Je ne pense pas qu'il existe de solution à ce problème - c'est le var_dump
/ print_r
interne de PHP qui ne limite pas la profondeur de la récursion (ou ne le fait pas faites-le correctement, au moins). Si vous installez l'extension XDebug , elle peut remplacer le var_dump
intégré par une version. qui gère beaucoup mieux la récursivité.
Autres conseils
Les serveurs proxy de charge différée contiennent toujours une instance de EntityManager de Doctrine & # 8217; s et toutes ses dépendances.
Par conséquent, un var_dump
videra probablement une très grande structure récursive qu'il est impossible de restituer et de lire. Vous devez utiliser \ Doctrine \ Common \ Util \ Debug :: dump ()
pour limiter le vidage à un niveau lisible par l'homme. Notez que la profondeur par défaut pour cette fonction est définie sur 2 (il s’agit du second paramètre)
Utilisez la méthode toArray
de la classe Doctrine_Record
var_dump($doctrine_record->toArray());
affichera uniquement les champs de la base de données et évitera de vider l'intégralité du contenu interne de Doctrine (qui contient l'auto-référence / récursivité)
Vous pouvez utiliser toArray si vous êtes sûr que l'objet est une instance de Doctrine_Collection. Xdebug n’aide pas les dossiers de doctrine.
La façon dont je suggère d'implémenter une fonction récursive personnalisée pour imprimer un objet, qui utilise Doctrine_Record :: toArray () lorsque cela est nécessaire
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
}
}
}
Certaines fonctions récursives à déboguer avec un maximum de niveaux d'imbrication sont ici
http://php.net/manual/fr/function.var- dump.php
Regardez les commentaires, recherchez "récursivité"