Zwiększenie limitu wywołań funkcji zagnieżdżania

127

W PHP jest jeden bardzo zły limit: jeśli wywołasz jakąś funkcję a1 (), która wywołuje a2 (), wywołuje a3 ... więc kiedy a99()zadzwonisz a100(), zobaczysz

Błąd krytyczny: osiągnięto maksymalny poziom zagnieżdżenia funkcji „100”, przerywanie!

Czy istnieje sposób na zwiększenie limitu 100 wywołań zagnieżdżania do 500 lub 10000?

Ma to dla mnie kluczowe znaczenie, ponieważ tworzę system oparty na zdarzeniach z wieloma wywołaniami zwrotnymi.

barbushin
źródło
12
100 wydaje się trochę przesadzone, nawet jak na ramy zdarzeń.
Ignacio Vazquez-Abrams
7
@Ignacio: to całkiem proste, nawet jeśli koncentrujemy się na strukturze zdarzeń, mieć funkcję rekurencyjną, która wymaga znacznie wyższego poziomu zagnieżdżenia. Dziesiątki tysięcy (a nawet milionów) nie jest rzadkością w takim scenariuszu.
Abel
stackoverflow.com/a/36440027/2652524 Rozwiązuję swoje, używając tej odpowiedzi
Gujarat Santana

Odpowiedzi:

254

Ten komunikat o błędzie pochodzi w szczególności z rozszerzenia XDebug. Sam PHP nie ma limitu zagnieżdżania funkcji. Zmień ustawienie w swoim php.ini:

xdebug.max_nesting_level = 200

lub w swoim kodzie PHP:

ini_set('xdebug.max_nesting_level', 200);

Jeśli chodzi o to, czy naprawdę musisz to zmienić (tj .: jeśli istnieje alternatywne rozwiązanie funkcji rekurencyjnej), nie mogę tego powiedzieć bez kodu.

netcoder
źródło
Miałem ten sam problem. Mój max_nesting_level został ustawiony na 100, ale w moim przypadku w niektórych przypadkach możliwe jest wykonanie 1000 rekurencyjnych wywołań. Więc ustawiłem na 10000, aby uniknąć tego błędu xdebug. We wszystkich przypadkach zawsze lepiej niż pozwolić PHP bez ograniczeń.
SkaJess
9
Jeśli nie ma tej xdebug.max_nesting_level = 100opcji w swojej php.ini prostu wklej to w.
M. Reza Nasirloo
@Pedram Prawidłowy sposób skopiowania tego w pliku php ini znajduje się w /etc/php5/apache2/conf.d/20-xdebug.ini, a nie w normalnym php.ini. Po prostu dobra praktyka
Enrique Quero
3
@EnriqueQuero Zależy od systemu i systemu operacyjnego.
netcoder
To działa! Nieważne, czy używasz XDebug, czy nie, ani jeśli zakomentujesz linię w php.ini. Jawnie użyłem: ini_set ('xdebug.max_nesting_level', -1);
user2928048
13

Czy masz zainstalowany Zend, IonCube lub xDebug? Jeśli tak, prawdopodobnie jest to źródło tego błędu.

Wpadłem na to kilka lat temu i skończyło się na tym, że Zend stawia to ograniczenie, a nie PHP. Oczywiście usunięcie go pozwoli Ci przekroczyć 100 iteracji, ale ostatecznie osiągniesz limity pamięci.

Ryan C -Xnuiem- Meinzer
źródło
1

Osobiście sugerowałbym, że jest to błąd, w przeciwieństwie do ustawienia, które wymaga dostosowania. W moim kodzie było tak, ponieważ miałem klasę, która miała taką samą nazwę jak biblioteka w jednym z moich kontrolerów i wydawało się, że się zepsuje.

Wyświetlaj błędy i zobacz, gdzie to się dzieje.

Antony
źródło