var_display_max_depth info debug composer chrome recursion xdebug php

recursion - info - Solución para "Error fatal: nivel máximo de anidación de función de ''100'' alcanzado, abortando!" En PHP



xdebug php ini (21)

Otra solución si está ejecutando script php en CLI (cmd)

El archivo php.ini que necesita editar es diferente en este caso. En mi instalación de WAMP, el archivo php.ini que se carga en la línea de comando es:

/wamp/bin/php/php5.5.12/php.ini

en lugar de / wamp / bin / apache / apache2.4.9 / bin / php.ini que se carga cuando php se ejecuta desde el navegador

He creado una función que encuentra todas las URL dentro de un archivo html y repite el mismo proceso para cada contenido html vinculado a las URL descubiertas. La función es recursiva y puede continuar sin fin. Sin embargo, he puesto un límite a la recursión estableciendo una variable global que hace que la recursión se detenga después de 100 recursiones.

Sin embargo, php devuelve este error:

Error fatal: se alcanzó el nivel máximo de anidación de la función de ''100'', abortando! en D: / wamp / www / crawler1 / simplehtmldom_1_5 / simple_html_dom.php en la línea 1355

Encontré una solución aquí: aumentar el límite de llamadas a función de anidamiento, pero esto no funciona en mi caso.

Estoy citando una de las respuestas del enlace mencionado anteriormente. Por favor, considéralo.

"¿Tiene instalado Zend, IonCube o xDebug? En caso afirmativo, es probable que de allí provenga este error.

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

¿Hay alguna forma de aumentar el nivel máximo de anidación de funciones en PHP?



En lugar de deshabilitar el xdebug, puede establecer el límite superior como

xdebug.max_nesting_level = 500


En lugar de recurrir a una función recursiva, trabaje con un modelo de cola para aplanar la estructura.

$queue = array(''http://example.com/first/url''); while (count($queue)) { $url = array_shift($queue); $queue = array_merge($queue, find_urls($url)); } function find_urls($url) { $urls = array(); // Some logic filling the variable return $urls; }

Hay diferentes formas de manejarlo. Puede realizar un seguimiento de más información si necesita alguna información sobre el origen o las rutas atravesadas. También hay colas distribuidas que pueden funcionar con un modelo similar.


En su caso, definitivamente la instancia del rastreador tiene más límite de Xdebug para rastrear errores e información de depuración.

Pero, en otros casos, también errores como PHP o archivos core como las bibliotecas CodeIgniter crearán un caso así y si incluso aumenta la configuración del nivel x-debug, no desaparecería.

Por lo tanto, mira en tu código cuidadosamente :).

Aquí estaba el problema en mi caso.

Tenía una clase de servicio que es biblioteca en CodeIgniter. Tener una función dentro así

class PaymentService { private $CI; public function __construct() { $this->CI =& get_instance(); } public function process(){ //lots of Ci referencing here... }

Mi controlador de la siguiente manera:

$this->load->library(''PaymentService''); $this->process_(); // see I got this wrong instead it shoud be like

Llamada de función en la última línea era incorrecta debido al error tipográfico, en su lugar debería haber sido como a continuación:

$this->Payment_service->process(); //the library class name

Luego, seguí recibiendo el mensaje de error de exceder. Pero deshabilité XDebug pero no ayudó. En cualquier caso, compruebe el nombre de su clase o su código para una correcta función de llamada.


Intenta buscar en /etc/php5/conf.d/ para ver si hay un archivo llamado xdebug.ini

max_nesting_level es 100 por defecto

Si no está configurado en ese archivo, agregue:

xdebug.max_nesting_level=300

hasta el final de la lista, así que se ve así

xdebug.remote_enable=on xdebug.remote_handler=dbgp xdebug.remote_host=localhost xdebug.remote_port=9000 xdebug.profiler_enable=0 xdebug.profiler_enable_trigger=1 xdebug.profiler_output_dir=/home/drupalpro/websites/logs/profiler xdebug.max_nesting_level=300

luego puede usar @Andrey''s prueba @Andrey''s @Areyys antes y después de hacer este cambio para ver si funcionó.

php -r ''function foo() { static $x = 1; echo "foo ", $x++, "/n"; foo(); } foo();''


Otra solución es agregar xdebug.max_nesting_level = 200 en tu php.ini


Podría intentar reducir el anidamiento mediante la implementación de trabajadores paralelos (como en el cómputo en clúster) en lugar de aumentar el número de llamadas a función de anidación.

Por ejemplo: define un número limitado de espacios (por ejemplo, 100) y supervisa el número de "trabajadores" asignados a cada uno de ellos. Si algún espacio se vuelve libre, pones a los trabajadores que esperan "en ellos".


Puede convertir su código recursivo en un código iterativo, que simula la recursión. Esto significa que debe presionar el estado actual (url, documento, posición en el documento, etc.) en una matriz, cuando llegue a un enlace, y sacarlo de la matriz, cuando este enlace haya finalizado.


Si estás usando Laravel, hazlo

composer update

Esto debería ser trabajo.


También es posible corregir esto directamente en php, por ejemplo en el archivo de configuración de tu proyecto.

ini_set(''xdebug.max_nesting_level'', 200);


También puede modificar la función {debug} en modifier.debug_print_var.php, para limitar su recursión en objetos.

Alrededor de la línea 45, antes:

$results .= ''<br>'' . str_repeat(''&nbsp;'', $depth * 2) . ''<b> -&gt;'' . strtr($curr_key, $_replace) . ''</b> = '' . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);

Después :

$max_depth = 10; $results .= ''<br>'' . str_repeat(''&nbsp;'', $depth * 2) . ''<b> -&gt;'' . strtr($curr_key, $_replace) . ''</b> = '' . ($depth > $max_depth ? ''Max recursion depth:''.(++$depth) : smarty_modifier_debug_print_var($curr_val, ++$depth, $length));

De esta forma, Xdebug se comportará normalmente: limite la profundidad de recursión en var_dump y así sucesivamente. ¡Como este es un problema inteligente, no un Xdebug!


Tuve este problema con WordPress en cloud9. Resulta que fue el plugin W3 Caching. Inhabilité el complemento y funcionó bien.


Tuve un error cuando estaba instalando muchos complementos Así que el error 100 mostró la ubicación del último complemento que instalé C: / wamp / www / mysite / wp-content / plugins / "..." así que eliminé este complemento carpeta en la C: unidad, todo volvió a la normalidad. Creo que tengo que limitar la cantidad de plug-in que instalo o que he activado. buena suerte, espero que ayude


Una solución simple resolvió mi problema. Acabo de comentar esta línea:

zend_extension = "d:/wamp/bin/php/php5.3.8/zend_ext/php_xdebug-2.1.2-5.3-vc9.dll

en mi archivo php.ini Esta extensión estaba limitando la pila a 100 así que la deshabilité. La función recursiva ahora está funcionando como se anticipó.


Vaya a su archivo de configuración php.ini y cambie la siguiente línea:

xdebug.max_nesting_level=100

a algo como:

xdebug.max_nesting_level=200


Verifique la recursión desde la línea de comando:

php -r ''function foo() { static $x = 1; echo "foo ", $x++, "/n"; foo(); } foo();''

si result> 100 THEN verifique el límite de memoria;


en Ubuntu usando PHP 5.59:
llegó a `:

/etc/php5/cli/conf.d

y encuentra tu xdebug.ini en ese directorio, en mi caso es 20-xdebug.ini

y agrega esta línea `

xdebug.max_nesting_level = 200


o esto

xdebug.max_nesting_level = -1

establézcalo en -1 y no tiene que preocuparse por cambiar el valor del nivel de anidación.

`


php.ini:

xdebug.max_nesting_level = -1

No estoy del todo seguro de si el valor se desbordará alguna vez y alcanzará -1, pero nunca llegará a -1, o establecerá el max_nesting_level bastante alto.


probablemente sucedió debido a xdebug.

Intente comentar la siguiente línea en su "php.ini" y reinicie su servidor para volver a cargar PHP.

";xdebug.max_nesting_level"


<?php ini_set(''xdebug.max_nesting_level'', 9999); ... your code ...

PD Cambia 9999 a cualquier número que desees.