Das Limit für Aufrufe von Verschachtelungsfunktionen wird erhöht

127

Es gibt eine sehr schlechte Grenze in PHP: Wenn Sie eine Funktion a1 () aufrufen, die a2 () aufruft, die a3 aufruft ... also, wann Sie a99()aufrufen, werden a100()Sie sehen

Schwerwiegender Fehler: Maximale Funktionsverschachtelungsstufe von '100' erreicht, Abbruch!

Gibt es eine Möglichkeit, das Limit von 100 Verschachtelungsaufrufen auf 500 oder 10000 zu erhöhen?

Dies ist für mich von entscheidender Bedeutung, da ich ein ereignisbasiertes System mit vielen Rückrufen entwickle.

barbushin
quelle
12
100 scheint selbst für einen Veranstaltungsrahmen etwas übertrieben.
Ignacio Vazquez-Abrams
7
@Ignacio: Es ist ziemlich einfach, eine rekursive Funktion zu haben, die eine viel höhere Verschachtelungsebene benötigt, selbst wenn der Fokus auf einem Ereignis-Framework liegt. Zehntausende (oder sogar Millionen) sind in solchen Szenarien keine Seltenheit.
Abel
stackoverflow.com/a/36440027/2652524 Ich löse meine mit dieser Antwort
Gujarat Santana

Antworten:

254

Diese Fehlermeldung stammt speziell von der XDebug-Erweiterung. PHP selbst hat keine Verschachtelungsgrenze für Funktionen. Ändern Sie die Einstellung in Ihrer php.ini:

xdebug.max_nesting_level = 200

oder in Ihrem PHP-Code:

ini_set('xdebug.max_nesting_level', 200);

Ob Sie es wirklich ändern müssen (dh ob es eine alternative Lösung für eine rekursive Funktion gibt), kann ich ohne den Code nicht sagen.

Netcoder
quelle
Ich hatte das gleiche Problem. Mein max_nesting_level wurde auf 100 gesetzt, aber in meinem Fall ist es in einigen Fällen möglich, 1000 rekursive Aufrufe zu haben. Also habe ich auf 10000 gesetzt, um diesen xdebug-Fehler zu vermeiden. In allen Fällen ist es immer besser, als PHP ohne Limit zu lassen.
SkaJess
9
Wenn Sie diese xdebug.max_nesting_level = 100Option nicht in Ihrer php.ini haben, fügen Sie sie einfach ein.
M. Reza Nasirloo
@Pedram Der richtige Weg, dies in eine PHP-INI-Datei zu kopieren, ist in /etc/php5/apache2/conf.d/20-xdebug.ini, nicht in der normalen PHP.ini. Nur eine gute Übung
Enrique Quero
3
@EnriqueQuero Abhängig vom System und Betriebssystem.
Netcoder
Es klappt! Egal ob Sie XDebug verwenden oder nicht, auch nicht, wenn Sie die Zeile in der php.ini auskommentieren. Ich habe explizit verwendet: ini_set ('xdebug.max_nesting_level', -1);
user2928048
13

Haben Sie Zend, IonCube oder xDebug installiert? Wenn ja, erhalten Sie diesen Fehler wahrscheinlich von dort.

Ich bin vor ein paar Jahren darauf gestoßen, und es endete damit, dass Zend diese Grenze dort setzte, nicht PHP. Wenn Sie es entfernen, können Sie natürlich die 100 Iterationen überschreiten, aber Sie werden schließlich die Speichergrenzen erreichen.

Ryan C-Xnuiem-Meinzer
quelle
1

Persönlich würde ich vorschlagen, dass dies ein Fehler ist, im Gegensatz zu einer Einstellung, die angepasst werden muss. In meinem Code lag es daran, dass ich eine Klasse hatte, die den gleichen Namen wie eine Bibliothek in einem meiner Controller hatte, und es schien, als würde sie ausgelöst.

Ausgabefehler und sehen, wo dies ausgelöst wird.

Antonius
quelle