2008-10-19 14 views
8

Tengo un problema muy extraño cuando trato de var_dump (o print_r) un Objeto Doctrine, mis respuestas Apache con una página en blanco vacía (200 encabezado OK). Puedo var_dump un php var normales como:¿Por qué var_dump a Doctrine Objects mata mi Apache?

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

y trabaja muy 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?

+4

Este es el número uno de los resultados en Google de "doctrina var_dum pag". Por favor, ¿puede aceptar la respuesta correcta (http://stackoverflow.com/a/8646048/3408) y no la de "aumentar el límite de memoria", que en realidad no resuelve el problema. – rjmunro

Respuesta

1

He tenido que a veces cuando trato de print_r() un objeto que se refiere a sí mismo - se mete 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 soluciona.

Editar: No creo que haya una solución real para esto - es var_dump/print_r interno de PHP que no limitan la profundidad en la recursión (o no lo hacen correctamente, al menos). Si instala la extensión XDebug, esto puede reemplazar el var_dump incorporado con una versión que maneja la recursión mucho mejor.

+11

no obtendrá resultados útiles, por lo tanto, mejor utilice la doctrina volcado \ Doctrine \ Common \ Util \ Debug :: dump() que se describe en otra respuesta – Gigala

+2

Aumentar el límite de memoria nunca debe considerarse una buena respuesta. Es como recomendar 'chmod 777'. – renoirb

8

utilizar el método de la clase Doctrine_RecordtoArray

var_dump($doctrine_record->toArray()); 

sólo mostrará los campos de base de datos y evitar el dumping las partes internas completas Doctrina (que contiene la referencia de auto/recursión por cierto)

49

proxies de carga Lazy siempre contienen una instancia de Doctrine's EntityManager y todas sus dependencias.

Por lo tanto, un var_dump posiblemente volcará una estructura recursiva muy grande que es imposible de reproducir y leer. Debe usar \Doctrine\Common\Util\Debug::dump() para restringir el dumping 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)

+0

muchas gracias por este consejo! – Besnik

+0

Una forma de evitar esto, además de aumentar el límite de memoria, sería usar [xdebug] (http://xdebug.org/) y aprovechar su 'xdebug.var_display_max_depth' para solo volcar a una cierta profundidad de todos esa recursión. – ficuscr

+0

es de otra manera –

0

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 sugeriría es la implementación de una función personalizada recursivo para imprimir objeto, que utilizan Doctrine_Record :: toArray() cuando 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 
     } 
    } 
} 

Algunos función recursiva para depurar con niveles de anidamiento Max son aquí

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

mira los comentarios, busque "recursividad"

Cuestiones relacionadas