Augmentation de la limite d'appels de fonction d'imbrication

127

Il y a une très mauvaise limite en PHP: si vous appelez une fonction a1 () qui appelle a2 (), qui appelle a3 ... alors quand vous a99()appellerez, a100()vous verrez

Erreur fatale: niveau maximal d'imbrication des fonctions de «100» atteint, abandon!

Existe-t-il un moyen d'augmenter la limite de 100 appels d'imbrication à 500 ou 10000?

C'est essentiel pour moi car je développe un système basé sur des événements avec beaucoup de rappels.

Barbushin
la source
12
100 semble un peu excessif, même pour un cadre événementiel.
Ignacio Vazquez-Abrams
7
@Ignacio: c'est assez simple, même si l'accent est mis sur un framework d'événement, d'avoir une fonction récursive qui nécessite un niveau d'imbrication beaucoup plus élevé. Des dizaines de milliers (voire des millions) ne sont pas rares dans de tels scénarios.
Abel
stackoverflow.com/a/36440027/2652524 Je résous le mien en utilisant cette réponse
Gujarat Santana

Réponses:

254

Ce message d'erreur provient spécifiquement de l'extension XDebug. PHP lui-même n'a pas de limite d'imbrication de fonctions. Modifiez le paramètre dans votre php.ini:

xdebug.max_nesting_level = 200

ou dans votre code PHP:

ini_set('xdebug.max_nesting_level', 200);

Quant à savoir si vous avez vraiment besoin de le changer (ie: s'il existe une solution alternative à une fonction récursive), je ne peux pas le dire sans le code.

netcoder
la source
J'ai eu le même problème. Mon max_nesting_level a été défini sur 100 mais dans mon cas, dans certains cas, il est possible d'avoir 1000 appels récursifs. Donc, j'ai mis à 10000 pour éviter cette erreur xdebug. Dans tous les cas, c'est toujours mieux que de laisser PHP sans limite.
SkaJess
9
Si vous n'avez pas cette xdebug.max_nesting_level = 100option dans votre php.ini, collez-la simplement.
M. Reza Nasirloo
@Pedram La manière correcte de copier cela dans un fichier php ini est dans /etc/php5/apache2/conf.d/20-xdebug.ini, pas dans le fichier php.ini normal. Juste une bonne pratique
Enrique Quero
3
@EnriqueQuero Dépend du système et du système d'exploitation.
netcoder
Ça marche! Peu importe si vous utilisez XDebug ou non, ni si vous commentez la ligne dans php.ini. J'ai utilisé explicitement: ini_set ('xdebug.max_nesting_level', -1);
user2928048
13

Avez-vous installé Zend, IonCube ou xDebug? Si tel est le cas, c'est probablement de là que vous obtenez cette erreur.

J'ai rencontré ça 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.

Ryan C -Xnuiem- Meinzer
la source
1

Personnellement, je dirais que c'est une erreur par opposition à un paramètre qui doit être ajusté. Dans mon code, c'était parce que j'avais une classe qui portait le même nom qu'une bibliothèque dans l'un de mes contrôleurs et qu'elle semblait la faire trébucher.

Sortez les erreurs et voyez où cela est déclenché.

Antony
la source