Aumentare il limite di chiamate della funzione di annidamento


127

C'è un limite molto brutto in PHP: se chiami una funzione a1 () che chiama a2 (), che chiama a3 ... quindi quando a99()chiamerai a100()vedrai

Errore irreversibile: livello massimo di annidamento della funzione di '100' raggiunto, interruzione!

Esiste un modo per aumentare il limite di 100 chiamate di nidificazione a 500 o 10000?

Questo è fondamentale per me perché sto sviluppando un sistema basato su eventi con molti callback.


12
100 sembra un po 'eccessivo, anche per un framework di eventi.
Ignacio Vazquez-Abrams,

7
@Ignacio: è abbastanza semplice, anche se il focus è su un framework di eventi, per avere una funzione ricorsiva che ha bisogno di un livello di annidamento molto più alto. Decine di migliaia (o addirittura milioni) non sono rari in questo scenario.
Abele,

stackoverflow.com/a/36440027/2652524 Risolvo il mio usando questa risposta
Gujarat Santana

Risposte:


254

Questo messaggio di errore proviene specificamente dall'estensione XDebug. PHP stesso non ha un limite di nidificazione delle funzioni. Cambia l'impostazione nel tuo php.ini:

xdebug.max_nesting_level = 200

o nel tuo codice PHP:

ini_set('xdebug.max_nesting_level', 200);

E se davvero dovessi cambiarlo (es: se esiste una soluzione alternativa a una funzione ricorsiva), non posso dirlo senza il codice.


Ho avuto lo stesso problema. Il mio max_nesting_level era impostato su 100 ma nel mio caso, in alcuni casi, è possibile avere 1000 chiamate ricorsive. Quindi, ho impostato su 10000 per evitare questo errore xdebug. In ogni caso, è sempre meglio che lasciare PHP senza limiti.
SkaJess,

9
Se non hai questa xdebug.max_nesting_level = 100opzione nel tuo php.ini, incollala e basta.
M. Reza Nasirloo

@Pedram Il modo corretto di copiarlo in un file php ini è in /etc/php5/apache2/conf.d/20-xdebug.ini, non nel normale php.ini. Solo una buona pratica
Enrique Quero,

3
@EnriqueQuero Dipende dal sistema e dal sistema operativo.
netcoder,

Funziona! Non importa se usi XDebug o meno, né se commenti la riga in php.ini. Ho usato esplicitamente: ini_set ('xdebug.max_nesting_level', -1);
user2928048

13

Zend, IonCube o xDebug sono installati? In tal caso, probabilmente è da lì che ricevi questo errore.

Mi sono imbattuto in questo alcuni anni fa, e alla fine è stato Zend a mettere quel limite lì, non PHP. Ovviamente rimuoverlo ti permetterà di superare le 100 iterazioni, ma alla fine colpirai i limiti di memoria.


1

Personalmente suggerirei che questo è un errore rispetto a un'impostazione che deve essere modificata. Nel mio codice era perché avevo una classe che aveva lo stesso nome di una libreria all'interno di uno dei miei controller e sembrava inciampare.

Emetti errori e vedi dove viene attivato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.