Solution pour " Erreur fatale: niveau maximum de '100' atteint, abandon!"en PHP

j'ai créé une fonction qui trouve toutes les URLs d'un fichier html et qui répète le même processus pour chaque contenu html lié aux URLs découvertes. La fonction est récursive et peut continuer indéfiniment. Cependant, j'ai mis une limite à la récursion en définissant une variable globale qui provoque l'arrêt de la récursion après 100 récursions.

cependant, php renvoie cette erreur:

Fatal error: Maximum de la fonction de niveau d'imbrication de '100' atteint, avorter! dans D:wampwwwcrawler1simplehtmldom_1_5simple_html_dom.php on line 1355

ERROR

j'ai trouvé une solution ici: augmentation des appels de fonction de nidification limite mais cela ne fonctionne pas dans mon cas.

je cite une des réponses du lien mentionné ci-dessus. Pensez à elle.

"avez-vous Zend, IonCube, ou xDebug installé? Si oui, c'est probablement l'endroit où vous obtenez cette erreur.

j'ai rencontré ça il y a quelques années, et ça a fini par être Zend mettant cette limite là, Pas PHP. Bien sûr, le supprimer vous permettra de dépasser les 100 itérations, mais vous finirez par atteindre les limites de mémoire."

Est-il un moyen d'augmenter le maximum de la fonction de niveau d'imbrication dans PHP

115
demandé sur Community 2011-12-28 16:46:23

21 réponses

augmente la valeur de xdebug.max_nesting_level dans votre php.ini: http://xdebug.org/docs/all_settings#max_nesting_level

129
répondu Maxence 2012-05-09 08:08:48

une solution simple a résolu mon problème. Je viens de commenter cette ligne:

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

dans mon dossier php.ini . Cette extension limitait la pile à 100 donc je l'ai désactivée. La fonction récursive fonctionne maintenant comme prévu.

49
répondu Rafay 2015-04-23 07:06:04

plutôt que d'opter pour une fonction récursive, travaillez avec un modèle de file d'attente pour aplatir la structure.

$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;
}

Il y a différentes façons de le gérer. Vous pouvez garder une trace de plus d'informations si vous avez besoin d'un aperçu sur l'origine ou les chemins parcourus. Il y a aussi des files d'attente distribuées qui peuvent fonctionner sur un modèle similaire.

42
répondu Louis-Philippe Huberdeau 2011-12-28 13:18:47

une autre solution est d'ajouter xdebug.max_nesting_level = 200 dans votre php.ini

38
répondu bacar ndiaye 2013-06-25 11:50:02

plutôt que de désactiver xdebug, vous pouvez définir la limite supérieure comme

xdebug.max_nesting_level=500

23
répondu shahinam 2014-03-13 15:59:39

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);

16
répondu svassr 2015-10-19 15:08:44

est 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"

12
répondu vandersondf 2013-07-25 02:17:23

essayez de regarder dans / etc/php5 / conf.d / pour voir s'il y a un fichier appelé xdebug.ini

max_nesting_level est de 100 par défaut

si elle n'est pas définie dans ce fichier ajouter:

xdebug.max_nesting_level=300

à la fin de la liste donc il ressemble à ceci

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

vous pouvez alors utiliser le test @Andrey's avant et après avoir effectué ce changement pour voir si cela a fonctionné.

php -r 'function foo() { static $x = 1; echo "foo ", $x++, "\n"; foo(); } foo();'
12
répondu Lee Woodman 2017-05-23 12:10:33

allez dans votre php.fichier de configuration ini et modifier la ligne suivante:

xdebug.max_nesting_level=100

à quelque chose comme:

xdebug.max_nesting_level=200
12
répondu Yasssine ELALAOUI 2015-11-23 15:11:26

sur Ubuntu en utilisant PHP 5.59 :

a obtenu":

/ etc/php5/cli / conf.d

et trouvez votre xdebug.ini dir que, dans mon cas, c'est 20-xdebug.ini

et ajouter cette ligne "

xdebug.max_nesting_level = 200



ou ce

xdebug.max_nesting_level = -1

mettez-le à -1 et vous n'avez pas à vous inquiéter de changer la valeur du niveau de nidification.

"

12
répondu Gujarat Santana 2016-04-06 01:45:49

de php.ini:

xdebug.max_nesting_level = -1

Je ne suis pas entièrement sûr si la valeur va jamais déborder et atteindre -1, mais soit elle n'atteindra jamais -1, soit elle réglera le niveau max_nesting_ assez élevé.

7
répondu Martyn Shutt 2015-08-17 15:43:32

vous pourriez essayer de remuer vers le bas la nidification en mettant en œuvre des travailleurs parallèles (comme dans cluster computing) au lieu d'augmenter le nombre d'appels de fonction de nidification.

par exemple: vous définissez un nombre limité de slots (par exemple: 100) et surveiller le nombre de "travailleurs" affectés à chacun d'eux ou à certains d'entre eux. Si n'importe quelles fentes deviennent libres, vous mettez les ouvriers en attente "dans eux".

6
répondu tamasgal 2011-12-28 12:52:36

vous pouvez convertir votre code récursif en un code itératif, qui simule la récursion. Cela signifie que vous devez appuyer sur le statut actuel (url, document, position dans le document, etc.) dans un tableau, lorsque vous atteignez un lien, et la faire sortir de la matrice, lorsque ce lien est terminé.

5
répondu Yogu 2011-12-28 12:53:34

Vérifier la récursivité de la ligne de commande:

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

si résultat > 100, alors vérifier la limite de mémoire;

4
répondu Andrey 2015-03-23 10:18:46

si vous utilisez Laravel, faites

composer update

ça devrait être du travail.

4
répondu Putri Dewi Purnamasari 2016-04-12 07:20:20
<?php
ini_set('xdebug.max_nesting_level', 9999);
... your code ...

P. S. changez 9999 pour n'importe quel numéro que vous voulez.

1
répondu cofirazak 2018-05-01 08:16:19

j'ai eu une erreur quand j'installais de nombreux plugins donc l'erreur 100 montré y compris l'emplacement du dernier plugin que j'ai installé C:\wamp\www\mysite\wp-content\plugins\"..."donc j'ai supprimé ce dossier de plugin sur le lecteur C: puis tout était redevenu normal.Je pense que je dois limiter la quantité de plug-in j'ai installer ou avoir activé .bonne chance j'espère que cela aide

0
répondu CalvinMD 2015-12-06 00:17:17

dans votre cas c'est certainement l'instance crawler qui a plus de limite Xdebug pour tracer l'erreur et déboguer l'information.

mais, dans d'autres cas aussi des erreurs comme sur des fichiers PHP ou des fichiers de base comme les bibliothèques CodeIgniter vont créer un tel cas et si vous même augmentez le paramètre de niveau X-debug il ne disparaîtrait pas.

alors, regardez attentivement votre code :) .

Voici la question dans mon cas.

j'ai eu un service classe qui est bibliothèque en CodeIgniter. Avoir une fonction à l'intérieur comme ça.

 class PaymentService {

    private $CI;

    public function __construct() {

        $this->CI =& get_instance();

   }

  public function process(){
   //lots of Ci referencing here...
   }

mon contrôleur comme suit:

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

appel de fonction sur la dernière ligne était erroné en raison de la faute de frappe, à la place il aurait dû être comme ci-dessous:

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

alors je continuais à recevoir le message d'erreur de dépassement. Mais J'ai désactivé XDebug mais je n'ai pas aidé. S'il Vous Plaît vérifier votre nom de classe ou votre code pour la fonction appropriée appel.

0
répondu danielad 2016-05-20 17:14:21

j'ai eu ce problème avec WordPress sur cloud9. Il s'avère que c'était le plugin de mise en cache W3. J'ai désactivé le plugin et ça a bien marché.

0
répondu sobeit 2017-01-30 15:01:14

une autre solution si vous exécutez un script php dans CLI (cmd)

Le php.fichier ini qui doit modifier est différent dans ce cas. Dans mon installation WAMP, le php.le fichier ini chargé en ligne de commande est:

\wamp\bin\php\php5.5.12\php.ini

au lieu de \wamp\bin\apache\apache2.4.9\bin\php.ini qui se charge lorsque php est lancé à partir du navigateur

0
répondu Binod 2017-01-30 16:37:36

vous pouvez également modifier la fonction {debug} dans le modificateur.debug_print_var.php, afin de limiter sa récursion en objets.

autour de la ligne 45, avant:

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

aprè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 cette façon, Xdebug se comportera toujours normalement: limiter la profondeur de récursion dans var_dump et ainsi de suite. Comme c'est un problème intelligent, pas un Xdebug!

-1
répondu theredled 2014-07-27 19:36:32