Почему var_dump a Doctrine Objects убивает мой Apache?

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

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

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

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

Это результат номер один в Google по запросу «doctrine var_dump». Пожалуйста, можете ли вы принять правильный ответ (stackoverflow.com/a/8646048/3408), а не ответ «увеличить лимит памяти», который на самом деле не решает проблему.

rjmunro 10.12.2012 18:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
8
1
11 605
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

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

вы не получите полезного вывода, поэтому лучше используйте дамп доктрины \ Doctrine \ Common \ Util \ Debug :: dump (), который описан в другом ответе

Gigala 09.04.2013 12:11

Увеличение предела памяти никогда не следует рассматривать как хороший ответ. Это все равно что рекомендовать chmod 777.

renoirb 24.03.2014 00:16

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

var_dump($doctrine_record->toArray());

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

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

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

Способом обойти это, помимо увеличения предела памяти, было бы использование xdebug и использование его xdebug.var_display_max_depth, чтобы выгружать только до определенной глубины всей этой рекурсии.

ficuscr 19.09.2013 18:03

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

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

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