J'ai créé une fonction qui trouve toutes les URL dans un fichier html et répète le même processus pour chaque contenu html lié aux URL découvertes. La fonction est récursive et peut durer indéfiniment. Cependant, j'ai mis une limite à la récursivité en définissant une variable globale qui provoque l'arrêt de la récursivité après 100 récursions.
Cependant, php renvoie cette erreur:
Erreur fatale: niveau maximal d'imbrication des fonctions de «100» atteint, abandon! dans D: \ wamp \ www \ crawler1 \ simplehtmldom_1_5 \ simple_html_dom.php à la ligne 1355
J'ai trouvé une solution ici: augmenter la limite d'appels de fonction d'imbrication mais cela ne fonctionne pas dans mon cas.
Je cite l'une des réponses du lien mentionné ci-dessus. Veuillez y réfléchir.
"Avez-vous installé Zend, IonCube ou xDebug? Si oui, c'est probablement de là que vous obtenez cette erreur.
Je suis tombé dessus il y a quelques années, et c'est finalement Zend qui a mis cette limite là-bas, pas PHP. Bien sûr, le supprimer vous permettra> de dépasser les 100 itérations, mais vous finirez par atteindre les limites de la mémoire. "
Existe-t-il un moyen d'augmenter le niveau d'imbrication maximal des fonctions en PHP
Réponses:
Augmentez la valeur de
xdebug.max_nesting_level
votrephp.ini
la source
xdebug.max_nesting_level = -1
Une solution simple a résolu mon problème. Je viens de commenter cette ligne:
dans mon
php.ini
dossier. Cette extension limitait la pile à100
donc je l'ai désactivée. La fonction récursive fonctionne maintenant comme prévu.la source
Plutôt que d'opter pour des appels de fonction récursifs, utilisez un modèle de file d'attente pour aplatir la structure.
Il existe différentes manières de le gérer. Vous pouvez garder une trace de plus d'informations si vous avez besoin d'informations sur l'origine ou les chemins traversés. Il existe également des files d'attente distribuées qui peuvent fonctionner sur un modèle similaire.
la source
Une autre solution consiste à ajouter
xdebug.max_nesting_level = 200
votre php.inila source
ini_set('xdebug.max_nesting_level', 200);
Plutôt que de désactiver xdebug, vous pouvez définir la limite supérieure comme
la source
Il est également possible de corriger cela directement en php, par exemple dans le fichier de configuration de votre projet.
ini_set('xdebug.max_nesting_level', 200);
la source
Accédez à votre fichier de configuration php.ini et modifiez la ligne suivante:
à quelque chose comme:
la source
sur Ubuntu en utilisant PHP 5.59:
allez à `:
et trouvez votre xdebug.ini dans ce répertoire , dans mon cas, c'est 20-xdebug.ini
et ajoutez cette ligne `
ou ca
réglez-le sur -1 et vous n'aurez pas à vous soucier de changer la valeur du niveau d'imbrication.
»
la source
probablement arrivé à cause de xdebug.
Essayez de commenter la ligne suivante dans votre "php.ini" et redémarrez votre serveur pour recharger PHP.
";xdebug.max_nesting_level"
la source
Essayez de chercher dans /etc/php5/conf.d/ pour voir s'il existe un fichier appelé xdebug.ini
max_nesting_level est égal à 100 par défaut
S'il n'est pas défini dans ce fichier, ajoutez:
à la fin de la liste pour qu'il ressemble à ceci
vous pouvez ensuite utiliser le test de @ Andrey avant et après avoir effectué cette modification pour voir si cela fonctionne.
la source
.ini
fichier séparé . Au fait, lorsque vous exécutez php5-fpm, ce fichier est probablement quelque part ici:/etc/php5/fpm/conf.d/20-xdebug.ini
php.ini:
Je ne suis pas tout à fait sûr que la valeur débordera et atteindra -1, mais elle n'atteindra jamais -1, ou elle fixera le max_nesting_level assez haut.
la source
Vous pouvez convertir votre code récursif en un code itératif, qui simule la récursivité. Cela signifie que vous devez pousser l'état actuel (url, document, position dans le document, etc.) dans un tableau, lorsque vous atteignez un lien, et le sortir du tableau, lorsque ce lien est terminé.
la source
Vous pouvez essayer de réduire l'imbrication en implémentant des nœuds de calcul parallèles (comme dans le calcul en cluster) au lieu d'augmenter le nombre d'appels de fonction d'imbrication.
Par exemple: vous définissez un nombre limité d'emplacements (ex. 100) et surveillez le nombre de "travailleurs" affectés à chacun / certains d'entre eux. Si des emplacements deviennent libres, vous mettez les ouvriers en attente "en eux".
la source
Vérifiez la récursivité depuis la ligne de commande:
si résultat> 100 ALORS vérifier la limite de mémoire;
la source
Si vous utilisez Laravel, faites
Cela devrait être du travail.
la source
PS Remplacez 9999 par le numéro de votre choix.
la source
J'ai eu une erreur lors de l'installation de nombreux plugins, donc l'erreur 100 a montré, y compris l'emplacement du dernier plugin que j'ai installé C: \ wamp \ www \ mysite \ wp-content \ plugins \ "..." donc j'ai supprimé ce plugin dossier sur le lecteur C: alors tout était revenu à la normale.Je pense que je dois limiter la quantité de plug-in que j'installe ou que j'ai activé. bonne chance j'espère que cela aide
la source
Dans votre cas, il est certain que l'instance du robot d'exploration a plus de limite Xdebug pour tracer les informations d'erreur et de débogage.
Mais, dans d'autres cas, des erreurs comme sur PHP ou des fichiers core comme les bibliothèques CodeIgniter créeront un tel cas et si vous augmentez même le paramètre de niveau x-debug, il ne disparaîtra pas.
Alors, regardez attentivement votre code :).
Voici le problème dans mon cas.
J'avais une classe de service qui est une bibliothèque dans CodeIgniter. Avoir une fonction à l'intérieur comme ça.
Mon contrôleur comme suit:
L'appel de fonction sur la dernière ligne était erroné à cause de la faute de frappe, au lieu de cela, il aurait dû être comme ci-dessous:
Ensuite, je continuais à recevoir le message d'erreur de dépassement. Mais j'ai désactivé XDebug mais pas aidé. De toute façon, veuillez vérifier le nom de votre classe ou votre code pour un appel de fonction correct.
la source
J'ai eu ce problème avec WordPress sur cloud9. Il s'avère que c'était le plugin W3 Caching. J'ai désactivé le plugin et cela a bien fonctionné.
la source
Une autre solution si vous exécutez un script php dans la CLI (cmd)
Le fichier php.ini à modifier est différent dans ce cas. Dans mon installation WAMP, le fichier php.ini qui est chargé en ligne de commande est:
au lieu de \ wamp \ bin \ apache \ apache2.4.9 \ bin \ php.ini qui se charge lorsque php est exécuté à partir du navigateur
la source
Vous pouvez également modifier la fonction {debug} dans modifier.debug_print_var.php, afin de limiter sa récursivité dans les objets.
Vers la ligne 45, avant:
Après :
De cette façon, Xdebug se comportera toujours normalement: limiter la profondeur de récursivité dans var_dump et ainsi de suite. Comme il s'agit d'un problème intelligent, pas un problème Xdebug!
la source
J'ai eu le même problème et j'adore comme ceci:
Ouvrez le fichier MySQL my.ini
Dans la section [mysqld], ajoutez la ligne suivante: innodb_force_recovery = 1
Enregistrez le fichier et essayez de démarrer MySQL
Supprimez cette ligne que vous venez d'ajouter et enregistrez
la source