Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么var_转储一个对象杀死我的Apache?_Php_Doctrine - Fatal编程技术网

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
只转储到所有递归的某个深度。