Збільшення ліміту викликів функції введення


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);
користувач2928048

13

У вас встановлені Zend, IonCube або xDebug? Якщо так, то, ймовірно, звідки ви отримуєте цю помилку.

Я натрапив на це кілька років тому, і в кінцевому підсумку Zend поставив ту межу, а не PHP. Звичайно, його видалення дозволить вам пройти повний 100 ітерацій, але ви зрештою досягнете межі пам'яті.


1

Особисто я б припустив, що це помилка на відміну від налаштування, яке потребує коригування. У моєму коді це було тому, що в мене був клас, який мав те саме ім’я, що і бібліотека, в одному з моїх контролерів, і, здавалося, це відключило його.

Виведіть помилки та подивіться, де це спрацьовує.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.