2010-11-27 2 views
113

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

Fatal error: Maximum function nesting level of '100' reached, aborting!

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

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

+10

100 кажется немного чрезмерным, даже для рамки событий. – 2010-11-27 20:47:05

+7

@Ignacio: это довольно просто, даже если фокус находится на фреймворке событий, иметь рекурсивную функцию, которая требует гораздо более высокого уровня вложенности. Десятки тысяч (или даже миллионы) нередки в таких сценариях. – Abel 2011-12-28 12:50:08

ответ

228

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

xdebug.max_nesting_level = 200 

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

ini_set('xdebug.max_nesting_level', 200); 

А если вам действительно нужно, чтобы изменить его (то есть: если есть альтернативное решение рекурсивной функции) , Я не могу сказать без кода.

14

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

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

2

Если вы используете XDebug (с XAMPP, например), вы можете установить уровень вложенности, добавив в php.ini файл (я бы предложил поставить в нижней части файла):

[XDebug] 
zend_extension = "C:\xampp\php\ext\php_xdebug.dll" 
; Other settings if needed 
xdebug.max_nesting_level = 500 

Этот будет установлен на 500 лимит, но при необходимости он может быть больше. Ссылка только на XDebug файл php_xdebug.dll

1

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

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

Смежные вопросы