Aumentando o limite de chamadas da função de aninhamento

127

Existe um limite muito ruim no PHP: se você chamar alguma função a1 () que chama a2 (), que chama a3 ... então quando a99()vai ligar, a100()você verá

Erro fatal: nível máximo de aninhamento de função de '100' atingido, abortando!

Existe alguma maneira de aumentar o limite de 100 chamadas de aninhamento para 500 ou 10000?

Isso é crítico para mim, porque estou desenvolvendo um sistema baseado em eventos com muitos retornos de chamada.

barbushin
fonte
12
100 parece um pouco excessivo, mesmo para uma estrutura de eventos.
Ignacio Vazquez-Abrams
7
@ Ignacio: é bastante simples, mesmo que o foco esteja em uma estrutura de eventos, ter uma função recursiva que precise de um nível de aninhamento muito mais alto. Dezenas de milhares (ou mesmo milhões) não são incomuns em tais cenários.
Abel
stackoverflow.com/a/36440027/2652524 Eu resolvo meus que usam esta resposta
Gujarat Santana

Respostas:

254

Esta mensagem de erro vem especificamente da extensão XDebug. O próprio PHP não possui um limite de aninhamento de função. Mude a configuração no seu php.ini:

xdebug.max_nesting_level = 200

ou no seu código PHP:

ini_set('xdebug.max_nesting_level', 200);

Quanto a se você realmente precisa alterá-lo (ou seja: se houver uma solução alternativa para uma função recursiva), não sei dizer sem o código.

codificador de rede
fonte
Eu tive o mesmo problema. Meu max_nesting_level foi definido como 100, mas no meu caso, em alguns casos, é possível ter 1000 chamadas recursivas. Então, configurei para 10000 para evitar esse erro do xdebug. Em todos os casos, é sempre melhor do que deixar o PHP sem limite.
SkaJess
9
Se você não tiver essa xdebug.max_nesting_level = 100opção no php.ini, cole-a.
M. Reza Nasirloo 16/15
@Pedram A maneira correta de copiar isso em um arquivo php ini é em /etc/php5/apache2/conf.d/20-xdebug.ini, não no php.ini normal. Apenas uma boa prática
Enrique Quero
3
@EnriqueQuero Depende do sistema e do SO.
Netcoder
Funciona! Não importa se você usa o XDebug ou não, nem se você comenta a linha no php.ini. Eu usei explicitamente: ini_set ('xdebug.max_nesting_level', -1);
User2928048
13

Você tem o Zend, IonCube ou xDebug instalado? Nesse caso, provavelmente é de onde você está recebendo esse erro.

Eu me deparei com isso há alguns anos atrás, e acabou sendo o Zend colocando esse limite lá, não o PHP. É claro que removê-lo permitirá que você ultrapasse as 100 iterações, mas acabará atingindo os limites de memória.

Ryan C -Xnuiem- Meinzer
fonte
1

Pessoalmente, sugiro que seja um erro, em oposição a uma configuração que precisa ser ajustada. No meu código, era porque eu tinha uma classe que tinha o mesmo nome de uma biblioteca dentro de um dos meus controladores e parecia desarmar.

Erros de saída e veja onde isso está sendo acionado.

Antony
fonte