Límite de llamadas de función de anidación creciente


127

Hay un límite muy malo en PHP: si llama a alguna función a1 () que llama a2 (), llama a a3 ... así que cuando a99()llame a100()verá

Error fatal: nivel máximo de anidación de la función de '100' alcanzado, ¡abortando!

¿Hay alguna forma de aumentar el límite de 100 llamadas de anidación a 500 o 10000?

Esto es crítico para mí porque estoy desarrollando un sistema basado en eventos con muchas devoluciones de llamada.


12
100 parece un poco excesivo, incluso para un marco de eventos.
Ignacio Vazquez-Abrams

77
@Ignacio: es bastante simple, incluso si el foco está en un marco de eventos, tener una función recursiva que necesita un nivel de anidamiento mucho más alto. Decenas de miles (o incluso millones) no son infrecuentes en tales escenarios.
Abel

Respuestas:


254

Este mensaje de error proviene específicamente de la extensión XDebug. PHP en sí mismo no tiene una función de límite de anidamiento. Cambie la configuración en su php.ini:

xdebug.max_nesting_level = 200

o en tu código PHP:

ini_set('xdebug.max_nesting_level', 200);

En cuanto a si realmente necesita cambiarlo (es decir: si hay una solución alternativa a una función recursiva), no puedo decirlo sin el código.


Yo tuve el mismo problema. Mi max_nesting_level se estableció en 100 pero en mi caso, en algunos casos, es posible tener 1000 llamadas recursivas. Entonces, configuré 10000 para evitar este error de xdebug. En todos los casos, siempre es mejor que dejar PHP sin límite.
SkaJess

9
Si no tiene esta xdebug.max_nesting_level = 100opción en su php.ini, simplemente péguela.
M. Reza Nasirloo

@Pedram La forma correcta de copiar eso en un archivo php ini es en /etc/php5/apache2/conf.d/20-xdebug.ini, no en el php.ini normal. Solo una buena práctica
Enrique Quero

3
@EnriqueQuero Depende del sistema y el sistema operativo.
netcoder

¡Funciona! No importa si usa XDebug o no, tampoco si comenta la línea en php.ini. Usé explícitamente: ini_set ('xdebug.max_nesting_level', -1);
user2928048

13

¿Tiene instalado Zend, IonCube o xDebug? Si es así, es probable que sea de donde obtenga este error.

Me encontré con esto hace unos años, y terminó siendo Zend poniendo ese límite allí, no PHP. Por supuesto, eliminarlo te permitirá superar las 100 iteraciones, pero eventualmente alcanzarás los límites de memoria.


1

Personalmente, sugeriría que se trata de un error en lugar de una configuración que debe ajustarse. En mi código fue porque tenía una clase que tenía el mismo nombre que una biblioteca dentro de uno de mis controladores y parecía tropezar.

Produzca errores y vea dónde se desencadena esto.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.