Увеличение лимита вызовов вложенных функций

В PHP есть одно очень плохое ограничение: если вы вызываете некоторую функцию a1(), которая вызывает a2(), которая вызывает a3... поэтому, когда a99() вызовет a100(), вы увидите

Фатальная ошибка: достигнут максимальный уровень вложенности функций «100», отмена!

Есть ли способ увеличить лимит 100 вложенных вызовов до 500 или 10000?

Это критично для меня, потому что я разрабатываю систему, основанную на событиях, с большим количеством обратных вызовов.


person barbushin    schedule 27.11.2010    source источник
comment
100 кажется немного чрезмерным даже для среды событий.   -  person Ignacio Vazquez-Abrams    schedule 27.11.2010
comment
@Ignacio: довольно просто, даже если основное внимание уделяется структуре событий, иметь рекурсивную функцию, для которой требуется гораздо более высокий уровень вложенности. Десятки тысяч (или даже миллионы) в таких сценариях не редкость.   -  person Abel    schedule 28.12.2011
comment
stackoverflow.com/a/36440027/2652524 Я решаю свой, используя этот ответ   -  person Gujarat Santana    schedule 06.04.2016
comment
@ IgnacioVazquez-Abrams Если вы занимаетесь функциональным программированием, а не объектно-ориентированным или процедурным, 100 — это капля в море. И, учитывая, что многие доктора наук в этой области рекомендуют использовать функционал вместо ООП или процедур, на самом деле вы всегда должны быть готовы к тому, что у вас будет много рекурсивных функций.   -  person lilHar    schedule 15.04.2021


Ответы (3)


Это сообщение об ошибке исходит именно от расширения XDebug. Сам PHP не имеет ограничения на вложенность функций. Измените параметр в файле php.ini:

xdebug.max_nesting_level = 200

или в вашем PHP-коде:

ini_set('xdebug.max_nesting_level', 200);

Что касается того, действительно ли вам нужно изменить его (т. Е. Если есть альтернативное решение для рекурсивной функции), я не могу сказать без кода.

person netcoder    schedule 27.11.2010
comment
У меня такая же проблема. Мой max_nesting_level был установлен на 100, но в моем случае в некоторых случаях возможно 1000 рекурсивных вызовов. Итак, я установил 10000, чтобы избежать этой ошибки xdebug. Во всех случаях это всегда лучше, чем позволить PHP без ограничений. - person SkaJess; 28.10.2014
comment
Если у вас нет этой опции xdebug.max_nesting_level = 100 в файле php.ini, просто вставьте ее. - person M. Reza Nasirloo; 16.03.2015
comment
@Pedram Правильный способ скопировать это в файле php ini — в /etc/php5/apache2/conf.d/20-xdebug.ini, а не в обычном php.ini. Просто хорошая практика - person Enrique Quero; 17.02.2016
comment
@EnriqueQuero Зависит от системы и ОС. - person netcoder; 17.02.2016
comment
Оно работает! Независимо от того, используете ли вы XDebug или нет, и если вы закомментируете строку в php.ini. Я явно использовал: ini_set('xdebug.max_nesting_level', -1); - person user2928048; 09.05.2016
comment
На mac osx расположение файла для меня было usr/local/php5/php.d/50-extension-xdebug.ini. - person SarthakGupta; 24.05.2016
comment
Начиная с Xdebug 2.3 значение по умолчанию — 256. - person martin; 13.03.2017
comment
удачный выстрел ini_set('xdebug.max_nesting_level', 300); работает на меня - person Hassan Saeed; 16.07.2017

У вас установлен Zend, IonCube или xDebug? Если это так, то, вероятно, отсюда вы получаете эту ошибку.

Я столкнулся с этим несколько лет назад, и в итоге это ограничение установил Zend, а не PHP. Конечно, его удаление позволит вам пройти 100 итераций, но в конечном итоге вы достигнете предела памяти.

person Ryan C -Xnuiem- Meinzer    schedule 27.11.2010

Лично я бы предположил, что это ошибка, а не параметр, который необходимо настроить. В моем коде это было потому, что у меня был класс с тем же именем, что и у библиотеки в одном из моих контроллеров, и это, казалось, сбивало его с толку.

Выведите ошибки и посмотрите, где это срабатывает.

person Antony    schedule 10.05.2017