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.


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.


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.