Почему объекты var_dump a Doctrine убивают мой Apache?

StackOverflow https://stackoverflow.com/questions/216409

  •  03-07-2019
  •  | 
  •  

Вопрос

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

$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 версией это намного лучше справляется с рекурсией.

Другие советы

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

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

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

var_dump($doctrine_record->toArray());

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

Вы можете использовать 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

Просмотрите комментарии, найдите " рекурсию "

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top