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


127

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

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

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

Для меня это критично, потому что я разрабатываю систему, основанную на событиях, с множеством обратных вызовов.


12
100 кажется немного чрезмерным даже для рамок мероприятий.
Игнасио Васкес-Абрамс,

7
@Ignacio: довольно просто, даже если основное внимание уделяется структуре событий, иметь рекурсивную функцию, которая требует гораздо более высокого уровня вложенности. Десятки тысяч (а то и миллионы) в таком сценарии не редкость.
Авель

stackoverflow.com/a/36440027/2652524 Я решаю свой, используя этот ответ
Гуджарат Сантана

Ответы:


254

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

xdebug.max_nesting_level = 200

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

ini_set('xdebug.max_nesting_level', 200);

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


У меня такая же проблема. Мой max_nesting_level был установлен на 100, но в моем случае в некоторых случаях возможно иметь 1000 рекурсивных вызовов. Итак, я установил 10000, чтобы избежать этой ошибки xdebug. Во всех случаях это всегда лучше, чем пускать PHP без ограничений.
SkaJess

9
Если у вас нет этой xdebug.max_nesting_level = 100опции в вашем php.ini, просто вставьте ее.
М. Реза Насирлоо,

@Pedram. Правильный способ скопировать это в файл php ini находится в /etc/php5/apache2/conf.d/20-xdebug.ini, а не в обычном php.ini. Просто хорошая практика
Энрике Куэро

3
@EnriqueQuero Зависит от системы и ОС.
netcoder

Оно работает! Независимо от того, используете ли вы XDebug или нет, а также, если вы закомментировали строку в php.ini. Я явно использовал: ini_set ('xdebug.max_nesting_level', -1);
user2928048

13

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

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


1

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.