为什么var_dump一个Doctrine Objects会杀死我的Apache?

时间:2008-10-19 13:12:36

标签: php doctrine

我有一个非常奇怪的问题,当我尝试var_dump(或print_r)一个Doctrine对象时,我的Apache响应空白页(200 OK标题)。我可以var_dump一个普通的php var:

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

它工作正常。但我不能使用任何Doctrine类中的任何对象(例如来自$connection->query()的结果,或来自我的具有Doctrine的对象模型中的类的实例)。

有人知道为什么会这样吗?

4 个答案:

答案 0 :(得分:51)

延迟加载代理总是包含Doctrine的EntityManager及其所有依赖项的实例。

因此,var_dump可能会转储一个非常大的递归结构,这种结构无法呈现和读取。您必须使用\Doctrine\Common\Util\Debug::dump()将转储限制为人类可读的级别。请注意,此函数的默认深度设置为2(它是第二个参数)

答案 1 :(得分:9)

使用toArray

Doctrine_Record方法
var_dump($doctrine_record->toArray());

只会显示数据库字段并避免转储完整的Doctrine内部(包含自引用/递归顺便说一句)

答案 2 :(得分:1)

我有时尝试print_r()一个自引用对象 - 它进入一个循环并耗尽内存。可能这就是发生在你身上的事情。

尝试增加内存限制(ini_set('memory_limit', '256M');)并查看是否修复了它。

编辑:我认为没有一个实际的解决方法 - 这是PHP的内部var_dump / print_r不限制递归的深度(或者至少不正确,至少)。如果您安装XDebug扩展名,则可以将内置var_dump替换为更好地处理递归的版本。

答案 3 :(得分:0)

如果您确定该对象是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

查看评论,寻找“递归”