¿Por qué var_dump a Doctrine Objects mata a mi Apache?
Pregunta
Tengo un problema muy extraño, cuando intento var_dump
(o print_r
) un Objeto de Doctrina, mis respuestas de Apache con una página en blanco vacía (encabezado de 200 OK) . Puedo var_dump
una var php normal como:
$dummy = array("a" => 1, "b" =>2);
Y funciona bien. Pero no puedo con ningún objeto de ninguna clase de Doctrine (como un resultado de $ connection- > query ()
, o una instancia de una clase de mi modelo de objetos con Doctrine).
¿Alguien sabe por qué sucede esto?
Solución
He tenido eso a veces al intentar print_r ()
un objeto que hace referencia a sí mismo: entra en un bucle y se queda sin memoria. Posiblemente eso es lo que te está pasando.
Intente aumentar el límite de memoria ( ini_set ('memory_limit', '256M');
) y vea si eso lo corrige.
Editar: no creo que haya una solución real para esto, es el var_dump
/ print_r
interno de PHP que no limita la profundidad de la recursión (o no hazlo correctamente, al menos). Si instala la XDebug , esto puede reemplazar la var_dump
incorporada con una versión que maneja la recursión mucho mejor.
Otros consejos
Los proxies de carga diferida siempre contienen una instancia del EntityManager de Doctrine y todas sus dependencias.
Por lo tanto, un var_dump
posiblemente volcará una estructura recursiva muy grande que es imposible de renderizar y leer. Debe utilizar \ Doctrine \ Common \ Util \ Debug :: dump ()
para restringir el volcado a un nivel legible por humanos. Tenga en cuenta que la profundidad predeterminada para esta función se establece en 2 (es el segundo parámetro)
Utilice el método toArray
de la clase Doctrine_Record
var_dump($doctrine_record->toArray());
solo mostrará los campos de la base de datos y evitará volcar las partes internas completas de Doctrine (que contiene la propia referencia / recursión por cierto)
Puede usar toArray si está seguro de que el objeto es una instancia de Doctrine_Collection. Xdebug no ayuda con los registros de doctrina.
La forma en que sugiero es implementar una función recursiva personalizada para imprimir un objeto, que use Doctrine_Record :: toArray () cuando sea necesario
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
}
}
}
Aquí se encuentran algunas funciones recursivas para depurar con los niveles máximos de anidamiento
http://php.net/manual/en/function.var- dump.php
Mire los comentarios, busque " recursión "