Решение для "Фатальная ошибка: достигнут максимальный уровень вложенности функции '100', прерывание!"в PHP - PullRequest
126 голосов
/ 28 декабря 2011

Я создал функцию, которая находит все URL-адреса в html-файле и повторяет один и тот же процесс для каждого html-содержимого, связанного с обнаруженными URL-адресами. Функция рекурсивная и может продолжаться бесконечно. Однако я наложил ограничение на рекурсию, установив глобальную переменную, которая вызывает остановку рекурсии после 100 рекурсий.

Однако php возвращает эту ошибку:

Неустранимая ошибка: достигнут максимальный уровень вложенности функции '100', прерывание! в D: \ wamp \ www \ crawler1 \ simplehtmldom_1_5 \ simple_html_dom.php на линии 1355

ERROR

Я нашел решение здесь: Увеличение лимита вызовов для функции вложенности , но в моем случае это не работает.

Я цитирую один из ответов по ссылке, указанной выше. Пожалуйста, примите это во внимание.

"У вас установлены Zend, IonCube или xDebug? Если это так, то, вероятно, именно откуда вы и получаете эту ошибку.

Я столкнулся с этим несколько лет назад, и в итоге Zend установил этот предел, а не PHP. Конечно, его удаление> позволит вам пройти 100 итераций, но в итоге вы достигнете пределов памяти. "

Есть ли способ увеличить максимальный уровень вложенности функций в PHP

Ответы [ 21 ]

7 голосов
/ 17 августа 2015

php.ini:

xdebug.max_nesting_level = -1

Я не совсем уверен, будет ли значение когда-либо переполнено и достигнет -1, но оно либо никогда не достигнет -1, либо установит max_nesting_level довольно высоким.

6 голосов
/ 28 декабря 2011

Вы можете преобразовать свой рекурсивный код в итеративный код, который имитирует рекурсию.Это означает, что вы должны помещать текущее состояние (URL, документ, положение в документе и т. Д.) В массив при достижении ссылки и извлекать ее из массива после завершения этой ссылки.

6 голосов
/ 28 декабря 2011

Вы можете попытаться развернуть вложенность путем реализации параллельных рабочих (например, в кластерных вычислениях) вместо увеличения числа вызовов вложенных функций.

Например: вы определяете ограниченное количество слотов (например,100) и контролировать количество «работников», назначенных каждому / некоторым из них.Если какие-либо слоты становятся свободными, вы помещаете ожидающих работников «в них».

5 голосов
/ 22 августа 2013

Проверьте рекурсию из командной строки:

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

если результат> 100, то проверьте ограничение памяти;

3 голосов
/ 12 апреля 2016

Если вы используете Laravel, сделайте

composer update

Это должно быть работой.

2 голосов
/ 01 мая 2018
<?php
ini_set('xdebug.max_nesting_level', 9999);
... your code ...

PS Измените 9999 на любой номер.

0 голосов
/ 27 июля 2014

Вы также можете изменить функцию {debug} в modifier.debug_print_var.php, чтобы ограничить ее рекурсию в объекты.

Вокруг строки 45, до:

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

После:

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

Таким образом, Xdebug будет по-прежнему вести себя нормально: ограничить глубину рекурсии в var_dump и так далее. Поскольку это умная проблема, а не проблема Xdebug!

0 голосов
/ 30 января 2017

Другое решение, если вы запускаете php-скрипт в CLI (cmd)

Файл php.ini, который нужно редактировать, в этом случае отличается.В моей установке WAMP файл php.ini, который загружается в командной строке:

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

вместо \ wamp \ bin \ apache \ apache2.4.9 \ bin \ php.ini, который загружается при запуске phpиз браузера

0 голосов
/ 25 февраля 2015

В вашем случае это определенно экземпляр экземпляра искателя с большим пределом Xdebug для отслеживания ошибок и отладочной информации.

Но, в других случаях, такие ошибки, как в PHP, или файлы ядра, такие как библиотеки CodeIgniter, будут создавать такой случайи если вы даже увеличите настройку уровня x-debug, она не исчезнет.

Итак, внимательно изучите ваш код :).

В этом случае была проблема.

У меня был класс обслуживания, который является библиотекой в ​​CodeIgniter.Наличие такой функции внутри.

 class PaymentService {

    private $CI;

    public function __construct() {

        $this->CI =& get_instance();

   }

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

Мой контроллер выглядит следующим образом:

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

Вызов функции в последней строке был неправильным из-за опечатки, вместо этого он должен был выглядеть следующим образом:

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

Затем я продолжал получать сообщение об ошибке превышения.Но я отключил XDebug, но не помог.В любом случае, пожалуйста, проверьте имя класса или код для правильного вызова функции.

0 голосов
/ 30 января 2017

У меня была эта проблема с WordPress на облаке9. Оказывается, это был плагин W3 Caching. Я отключил плагин, и он работал нормально.

...