Почему объекты var_dump a Doctrine убивают мой Apache?
Вопрос
У меня возникает очень странная проблема, когда я пытаюсь 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 р>
Просмотрите комментарии, найдите " рекурсию "