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)