Сайт Ильи Азарова

Syndicate content
Все что связано с CMF/CMS Drupal
Обновлено: 2 нед 3 дн назад

PHP. var_dump структуры с кучей указателей и рекурсия. Для чего действительно полезен xdebug

2012.02.23 — 16:56

Данная ситуация довольно редкая, однако все же встречается. Есть некая переменная, для которой надо посмотреть ее структуру. 

Мы начинаем делать

var_dump($fields);

и садимся в лужу, видя сообщение в логе сервера:

[Thu Feb 23 16:21:07 2012] [error] [client 127.0.0.1] PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 78045652 bytes) in /web/site1/includes/theme.inc on line 1080, referer: http://localhost/site1/

Что же произошло. В $fields где-то в глубине обнаружился указатель на объект который уже есть в fields и описан выше. И var_dump начинает рекурсивно "бегать" по структуре объекта, пока не сожрет всю память.

Получается, мы не можем посмотреть "что там внутри", без описания оберток. В drupal есть модуль devel, который использует библиотеку krumo, но в тех версиях, которые я видел - тоже нет лимитов глубины прохода.

Проблема решается установкой xdebug и использованием функции xdebug_var_dump(). У этого модуля можно задать глубину показа "внутренностей" в переменной xdebug.var_display_max_depth и указать количество объектов на конкретном уровне, которые можно показывать переменной xdebug.var_display_max_children.

Таким образом, можно не городить свои обертки для дампов. 

PS. Пишу это в качестве напоминания для себя.

PPS. Удивительно, до сих пор в PHP не предусмотрели штатно уровни вложенности в функции var_dump.