Php 为什么var_转储一个对象杀死我的Apache?
我有一个非常奇怪的问题,当我尝试Php 为什么var_转储一个对象杀死我的Apache?,php,doctrine,Php,Doctrine,我有一个非常奇怪的问题,当我尝试var\u dump(或print\r)一个条令对象时,我的Apache响应为一个空白页面(200 OK页眉)。我可以var\u dump一个普通的php变量,比如: $dummy = array("a" => 1, "b" =>2); 而且效果很好。但是我不能处理任何条令类中的任何对象(比如$connection->query()的结果,或者我的条令对象模型中的一个类实例) 有人知道为什么会发生这种情况吗?我有时在尝试打印自引用对象时会遇到这种情况
var\u dump
(或print\r
)一个条令对象时,我的Apache响应为一个空白页面(200 OK页眉)。我可以var\u dump
一个普通的php变量,比如:
$dummy = array("a" => 1, "b" =>2);
而且效果很好。但是我不能处理任何条令类中的任何对象(比如$connection->query()
的结果,或者我的条令对象模型中的一个类实例)
有人知道为什么会发生这种情况吗?我有时在尝试打印自引用对象时会遇到这种情况-它进入循环并耗尽内存。你可能就是这样 尝试增加内存限制(
ini\u set('memory\u limit','256M');
),看看这是否能解决问题
编辑:我不认为有一个实际的解决方案-这是PHP的内部
var\u dump
/print\u r
,它不限制递归的深度(或者至少不正确地执行)。如果您安装了扩展,则可以使用处理递归更好的版本替换内置的var\u dump
。使用doctor\u Record
类的toArray
方法
var_dump($doctrine_record->toArray());
将仅显示DB字段并避免转储完整的条令内部(其中包含自引用/递归顺便说一句)延迟加载代理始终包含条令的EntityManager实例及其所有依赖项
因此,
var\u dump
可能会转储一个无法呈现和读取的非常大的递归结构。您必须使用\doctor\Common\Util\Debug::dump()
将转储限制在人类可读的级别。请注意,此函数的默认深度设置为2(这是第二个参数)如果确定对象是Doctrine_Collection的实例,则可以使用toArray。
Xdebug对条令记录没有帮助
我建议的方法是实现一个自定义递归函数来打印对象,在需要时使用doctor_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
}
}
}
下面是一些使用最大嵌套级别进行调试的递归函数
查看评论,查找“递归”这是谷歌“doctrine var_dump”的头号搜索结果。请您接受正确答案()而不是“增加内存限制”答案,这并不能真正解决问题。不过,您不会得到有用的输出,因此最好使用另一个答案中描述的条令转储\条令\Common\Util\Debug::dump()。增加内存限制永远不应被视为一个好答案。这就像推荐
chmod 777
。除了增加内存限制之外,解决这个问题的一种方法是使用并利用它的xdebug.var\u display\u max\u depth
只转储到所有递归的某个深度。