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 cesar. 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: nivel máximo de anidación de la función de '100' alcanzado, ¡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 la función de anidación, pero esto no funciona en mi caso.
Cito una de las respuestas del enlace mencionado anteriormente. Por favor, considérelo.
"¿Tiene instalado Zend, IonCube o xDebug? Si es así, es probable que ese sea el origen de 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 ".
¿Hay alguna manera de aumentar el nivel máximo de anidación de funciones en PHP
Respuestas:
Aumentar el valor de
xdebug.max_nesting_level
en suphp.ini
fuente
xdebug.max_nesting_level = -1
Una solución simple resolvió mi problema. Acabo de comentar esta línea:
en mi
php.ini
archivo Esta extensión estaba limitando la pila,100
así que la desactivé. La función recursiva ahora funciona según lo previsto.fuente
En lugar de buscar llamadas a funciones recursivas, trabaje con un modelo de cola para aplanar la estructura.
Hay diferentes formas de manejarlo. Puede realizar un seguimiento de más información si necesita información sobre el origen o los caminos recorridos. También hay colas distribuidas que pueden funcionar con un modelo similar.
fuente
Otra solución es agregar
xdebug.max_nesting_level = 200
en su php.inifuente
ini_set('xdebug.max_nesting_level', 200);
En lugar de deshabilitar el xdebug, puede establecer el límite superior como
fuente
También es posible arreglar esto directamente en php, por ejemplo en el archivo de configuración de su proyecto.
ini_set('xdebug.max_nesting_level', 200);
fuente
Vaya a su archivo de configuración php.ini y cambie la siguiente línea:
a algo como:
fuente
en Ubuntu usando PHP 5.59:
llegó a `:
y encuentre su xdebug.ini en ese directorio, en mi caso es 20-xdebug.ini
y agrega esta línea `
o esto
configúrelo en -1 y no tendrá que preocuparse de cambiar el valor del nivel de anidación.
``
fuente
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"
fuente
Intente 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:
al final de la lista para que se vea así
entonces puede usar la prueba de @ Andrey antes y después de hacer este cambio para ver si funciona
fuente
.ini
archivo separado . Por cierto, cuando ejecutas php5-fpm este archivo probablemente esté en algún lugar aquí:/etc/php5/fpm/conf.d/20-xdebug.ini
php.ini:
No estoy completamente seguro de si el valor se desbordará y alcanzará -1, pero nunca alcanzará -1 o establecerá el max_nesting_level bastante alto.
fuente
Puede convertir su código recursivo en un código iterativo, que simula la recursividad. Esto significa que debe insertar 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.
fuente
Puede intentar reducir la anidación implementando trabajadores paralelos (como en la computación en clúster) en lugar de aumentar el número de llamadas a funciones de anidación.
Por ejemplo: usted define un número limitado de espacios (por ejemplo, 100) y monitorea el número de "trabajadores" asignados a cada uno de ellos. Si alguna de las máquinas tragamonedas queda libre, usted pone a los trabajadores en espera "en ellas".
fuente
Verifique la recursividad desde la línea de comando:
si el resultado> 100 ENTONCES verifique el límite de memoria;
fuente
Si estás usando Laravel, haz
Esto debería ser trabajo.
fuente
PD Cambie 9999 a cualquier número que desee.
fuente
Tuve un error cuando estaba instalando muchos complementos. Así que el error 100 mostró, incluyendo la ubicación del último complemento que instalé C: \ wamp \ www \ mysite \ wp-content \ plugins \ "...", así que eliminé este complemento carpeta en el disco C: luego todo volvió a la normalidad. Creo que tengo que limitar la cantidad de complementos que instalo o he activado. Buena suerte, espero que ayude
fuente
En su caso, definitivamente es la instancia del rastreador que tiene más límite de Xdebug para rastrear información de error y depuración.
Pero, en otros casos, también los errores como en PHP o los archivos centrales como las bibliotecas CodeIgniter crearán un caso así y si incluso aumenta la configuración del nivel de depuración x, no desaparecerá.
Entonces, mire su código cuidadosamente :).
Aquí estaba el problema en mi caso.
Tuve una clase de servicio que es la biblioteca en CodeIgniter. Tener una función dentro como esta.
Mi controlador de la siguiente manera:
La llamada a la función en la última línea fue incorrecta debido al error tipográfico, en cambio debería haber sido como a continuación:
Luego seguía recibiendo el mensaje de error exceder. Pero deshabilité XDebug pero no ayudó. De cualquier manera, verifique el nombre de su clase o su código para ver la función adecuada.
fuente
Tuve este problema con WordPress en cloud9. Resulta que era el plugin W3 Caching. Deshabilité el complemento y funcionó bien.
fuente
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:
en lugar de \ wamp \ bin \ apache \ apache2.4.9 \ bin \ php.ini que se carga cuando php se ejecuta desde el navegador
fuente
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:
Después :
De esta manera, Xdebug seguirá comportándose normalmente: limite la profundidad de recursión en var_dump y así sucesivamente. Como este es un problema inteligente, ¡no Xdebug!
fuente
Tuve el mismo problema y reslove así:
Abra el archivo MySQL my.ini
En la sección [mysqld], agregue la siguiente línea: innodb_force_recovery = 1
Guarde el archivo e intente iniciar MySQL
Elimine la línea que acaba de agregar y guarde
fuente