Aumento del límite de llamadas a funciones de anidamiento


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

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

¿Hay alguna manera de aumentar el límite de 100 llamadas de anidamiento a 500 o 10000?

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

 118
Author: Mridang Agarwalla, 2010-11-27

5 answers

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

xdebug.max_nesting_level = 200

O en su 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.

 238
Author: netcoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-28 19:21:25

¿Tiene Zend, ionCube o xDebug instalados? Si es así, es probable que sea de donde está obteniendo este error.

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

 14
Author: Ryan C -Xnuiem- Meinzer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-27 20:50:32

Si está usando XDebug (con XAMPP, por ejemplo), puede establecer el nivel de anidamiento agregando esto al archivo php.ini (sugeriría ponerlo en la parte inferior del archivo):

[XDebug]
zend_extension = "C:\xampp\php\ext\php_xdebug.dll"
; Other settings if needed
xdebug.max_nesting_level = 500

Esto se establecerá en 500 límite, pero podría más si es necesario. Solo enlace al archivo XDebug php_xdebug.dll

 2
Author: Gm Sona,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-08 14:54:37

Personalmente sugeriría que esto es un error en lugar de un ajuste que necesita ajuste. En mi código era porque tenía una clase que tenía el mismo nombre que una biblioteca dentro de uno de mis controladores y parecía tropezar.

Errores de salida y ver dónde se está activando esto.

 1
Author: Antony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-10 11:32:34

Sí, es posible aumentar el valor de xdebug.max_nesting_level en php.ini. Si ha hecho esto, no olvide reiniciar el servidor apache:

sudo /usr/sbin/apachectl restart

Pero en la mayoría de los casos este error no es causado por eso, sino por muchas redirecciones o errores en su página.

Así que simplemente cambie a depurar si tiene uno o observe sus registros.

 -1
Author: Walterwhites,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 17:11:50