Почему var_dump Объекты Doctrine убивают мой Apache? - PullRequest
8 голосов
/ 19 октября 2008

У меня очень странная проблема, когда я пытаюсь var_dump (или print_r) Doctrine Object, мой Apache отвечает пустой пустой страницей (заголовок 200 OK). Я могу var_dump обычный php var, как:

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

И все работает отлично. Но я не могу ни с каким объектом из какого-либо класса Doctrine (например, результат из $connection->query() или экземпляр класса из моей объектной модели с Doctrine).

Кто-нибудь знает, почему это происходит?

Ответы [ 4 ]

51 голосов
/ 27 декабря 2011

Ленивые загрузочные прокси всегда содержат экземпляр EntityManager Doctrine и все его зависимости.

Поэтому var_dump, возможно, выведет очень большую рекурсивную структуру, которую невозможно отобразить и прочитать. Вы должны использовать \Doctrine\Common\Util\Debug::dump(), чтобы ограничить сброс до уровня, удобочитаемого для человека. Обратите внимание, что глубина по умолчанию для этой функции установлена ​​на 2 (это второй параметр)

9 голосов
/ 26 сентября 2010

Используйте метод toArray класса Doctrine_Record

var_dump($doctrine_record->toArray());

будет отображать только поля БД и не будет сбрасывать полные внутренние данные Doctrine (кстати, между прочим, содержит собственную ссылку / рекурсию)

1 голос
/ 19 октября 2008

У меня было такое иногда при попытке print_r() объекта, ссылающегося на себя - он попадает в цикл и исчерпывает память. Возможно, это то, что с тобой происходит.

Попробуйте увеличить предел памяти (ini_set('memory_limit', '256M');) и посмотрите, исправит ли это.

Edit: я не думаю, что есть реальное исправление для этого - это внутреннее var_dump / print_r PHP, которое не ограничивает глубину рекурсии (или, по крайней мере, не делает это должным образом) Если вы установите расширение XDebug , это может заменить встроенный var_dump версией, которая намного лучше обрабатывает рекурсию.

0 голосов
/ 10 января 2012

Вы можете использовать toArray, если уверены, что объект является экземпляром Doctrine_Collection. 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

Посмотрите на комментарии, поищите "рекурсия"

...