recursion extension Solução para “Erro fatal: nível de aninhamento máximo de função de '100' alcançado, abortando!” Em PHP



xdebug php 72 (17)

Eu tive esse problema com o WordPress no cloud9. Acontece que era o plugin de cache do W3. Eu desativei o plugin e funcionou bem.

Eu fiz uma função que encontra todos os URLs dentro de um arquivo html e repete o mesmo processo para cada conteúdo HTML vinculado aos URLs descobertos. A função é recursiva e pode continuar indefinidamente. No entanto, eu coloquei um limite na recursão definindo uma variável global que faz com que a recursão pare após 100 recursões.

No entanto, o php retorna este erro:

Erro fatal: Nível máximo de aninhamento de 100%, abortando! em D: \ wamp \ www \ crawler1 \ simplehtmldom_1_5 \ simple_html_dom.php na linha 1355

Eu encontrei uma solução aqui: Aumentar o limite de chamadas de função de aninhamento, mas isso não está funcionando no meu caso.

Estou citando uma das respostas do link mencionado acima. Por favor, considere isso.

"Você tem o Zend, o IonCube ou o xDebug instalados? Se sim, é provavelmente de onde você está obtendo esse erro.

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

Existe uma maneira de aumentar o nível máximo de aninhamento de funções no PHP


Answer #1

No seu caso, é definitivamente a instância do crawler está tendo mais limite do Xdebug para rastrear erros e informações de depuração.

Mas, em outros casos, também erros como em PHP ou arquivos principais como bibliotecas CodeIgniter criam um caso assim e se você aumentar a configuração do nível x-debug, ele não desapareceria.

Então, olhe para o seu código com cuidado :).

Aqui estava o problema no meu caso.

Eu tinha uma classe de serviço que é biblioteca no CodeIgniter. Ter uma função dentro disso.

 class PaymentService {

    private $CI;

    public function __construct() {

        $this->CI =& get_instance();

   }

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

Meu controlador como segue:

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

A chamada de função na última linha estava errada devido ao erro de digitação, em vez disso deveria ter sido como abaixo:

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

Então eu estava recebendo a mensagem de erro excedente. Mas eu desativei o XDebug, mas não ajudei. De qualquer forma, por favor, verifique o nome da classe ou o seu código para a função adequada.



Answer #3

Se você estiver usando o Laravel, faça

composer update

Isso deve ser trabalho.


Answer #4

Vá para o arquivo de configuração do php.ini e altere a seguinte linha:

xdebug.max_nesting_level=100

para algo como:

xdebug.max_nesting_level=200

Answer #5
<?php
ini_set('xdebug.max_nesting_level', 9999);
... your code ...

PS Altere 9999 para qualquer número desejado.


Answer #6

provavelmente aconteceu por causa do xdebug.

Tente comentar a seguinte linha no seu "php.ini" e reinicie seu servidor para recarregar o PHP.

";xdebug.max_nesting_level"


Answer #7

Uma solução simples resolveu meu problema. Acabei de comentar esta linha:

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

no meu arquivo php.ini . Esta extensão estava limitando a pilha a 100 então eu a desativei. A função recursiva agora está funcionando como previsto.


Answer #8

no Ubuntu usando PHP 5.59:
tem que ':

/etc/php5/cli/conf.d

e encontre seu xdebug.ini nesse diretório, no meu caso é 20-xdebug.ini

e adicione esta linha

xdebug.max_nesting_level = 200


ou isto

xdebug.max_nesting_level = -1

defina-o como -1 e você não precisa se preocupar em alterar o valor do nível de aninhamento.

`


Answer #9

Também é possível corrigir isso diretamente no php, por exemplo, no arquivo de configuração do seu projeto.

ini_set('xdebug.max_nesting_level', 200);


Answer #10

Em vez de desabilitar o xdebug, você pode definir o limite superior como

xdebug.max_nesting_level = 500


Answer #11

Eu tive um erro quando eu estava instalando muitos plugins Então o erro 100 mostrou incluindo a localização do último plugin que eu instalei C: \ wamp \ www \ mysite \ wp-content \ plugins \ "..." então eu deletei este plugin pasta na unidade C: então tudo estava de volta ao normal.Eu acho que eu tenho que limitar a quantidade de plug-in eu instalar ou ter ativado .boa sorte eu espero que ajude


Answer #12

Outra solução se você estiver executando o script PHP no CLI (cmd)

O arquivo php.ini que precisa ser editado é diferente neste caso. Na minha instalação do WAMP, o arquivo php.ini que é carregado na linha de comando é:

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

em vez de \ wamp \ bin \ apache \ apache2.4.9 \ bin \ php.ini que carrega quando php é executado a partir do navegador


Answer #13

php.ini:

xdebug.max_nesting_level = -1

Eu não tenho certeza se o valor irá estourar e atingir -1, mas ele nunca chegará a -1, ou irá definir o max_nesting_level bem alto.


Answer #14

Você pode converter seu código recursivo em um código iterativo, que simula a recursão. Isso significa que você tem que empurrar o status atual (url, documento, posição no documento, etc.) para um array, quando você alcança um link, e o coloca fora do array, quando este link terminar.


Answer #15

Você também pode modificar a função {debug} em modifier.debug_print_var.php, para limitar sua recursão em objetos.

Em torno da linha 45, antes:

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

Depois de :

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

Dessa forma, o Xdebug ainda se comportará normalmente: limite a profundidade de recursão em var_dump e assim por diante. Como este é um problema inteligente, não um Xdebug!


Answer #16

Verifique a recursão a partir da linha de comando:

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

se resultar> 100 THEN, verifique o limite de memória;





php