ver variable var_export var_dump que imprimir contenido consola completo array php doctrine

php - variable - ¿Por qué var_dump a Doctrine Objects mata mi Apache?



var_export en php (4)

Tengo un problema muy extraño, cuando intento 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 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?


Lo he tenido algunas veces cuando trato de print_r() un objeto de referencia automática: 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 el var_dump / print_r interno de PHP que no limita la profundidad en la recursión (o al menos no lo hace correctamente). Si instala la extensión XDebug , esto puede reemplazar el var_dump incorporado con una versión que maneja la recursión mucho mejor.


Utilice el método toArray de la clase Doctrine_Record

var_dump($doctrine_record->toArray());

solo mostrará los campos DB y evitará que se descarguen todas las partes internas de Doctrine (que contiene auto referencia / recursividad 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 objetos, que usan Doctrine_Record :: toArray () cuando se necesita

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 } } }

Algunas funciones recursivas para depurar con niveles máximos de anidación están aquí

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

Mira los comentarios, busca "recursión"


Los proxies de carga diferida siempre contienen una instancia de EntityManager de Doctrine y todas sus dependencias.

Por lo tanto, un var_dump posiblemente va a volcar una estructura recursiva muy grande que es imposible de representar 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)