为什么var_dump一个Doctrine Objects会杀死我的Apache?
题
我有一个非常奇怪的问题,当我尝试 var_dump
(或 print_r
)一个Doctrine对象时,我的Apache响应空白页(200 OK标题) 。我可以 var_dump
一个普通的php var,如:
$dummy = array("a" => 1, "b" =>2);
它工作正常。但我不能使用任何Doctrine类中的任何对象(例如 $ connection-> query()
的结果,或者来自我的Doctrine对象模型的类的实例)。
有人知道为什么会这样吗?
解决方案
我有时在尝试 print_r()
一个自引用对象时 - 它进入循环并耗尽内存。可能这就是发生在你身上的事情。
尝试增加内存限制( ini_set('memory_limit','256M');
)并查看是否修复了它。
编辑:我认为没有一个实际的解决方案 - 它的PHP的内部 var_dump
/ print_r
不限制递归的深度(或不做得恰到好处,至少)。如果您安装了 XDebug 扩展程序,则可以使用版本替换内置的 var_dump
能够更好地处理递归。
其他提示
延迟加载代理总是包含Doctrine的EntityManager及其所有依赖项的实例。
因此, var_dump
可能会转储一个非常大的递归结构,这种结构无法呈现和读取。您必须使用 \ Doctrine \ Common \ Util \ Debug :: dump()
将转储限制为人类可读的级别。请注意,此函数的默认深度设置为2(它是第二个参数)
使用 Doctrine_Record
类的 toArray
方法
var_dump($doctrine_record->toArray());
只会显示数据库字段并避免转储完整的Doctrine内部(包含自引用/递归顺便说一句)
如果您确定该对象是Doctrine_Collection的实例,则可以使用toArray。 Xdebug对学说记录没有帮助。
我建议的方法是实现一个自定义递归函数来打印对象,当需要时使用Doctrine_Record :: toArray()
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
}
}
}
使用最大嵌套级别调试的一些递归函数在这里
http://php.net/manual/en/function.var- dump.php
查看评论,寻找“递归”