Решение для "Фатальная ошибка: достигнут максимальный уровень вложенности функции '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 ]

138 голосов
/ 09 мая 2012

Увеличьте значение xdebug.max_nesting_level в вашем php.ini

55 голосов
/ 29 декабря 2011

Простое решение решило мою проблему. Я только что прокомментировал эту строку:

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

в моем php.ini файле. Это расширение ограничивало стек до 100, поэтому я отключил его. Теперь рекурсивная функция работает как положено.

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

Вместо того, чтобы идти к рекурсивным вызовам функций, работайте с моделью очереди, чтобы сгладить структуру.

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

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

40 голосов
/ 25 июня 2013

Другое решение - добавить xdebug.max_nesting_level = 200 в ваш php.ini

23 голосов
/ 13 марта 2014

Вместо того, чтобы отключить xdebug, вы можете установить более высокий предел, например

xdebug.max_nesting_level = 500

18 голосов
/ 19 октября 2015

Также это можно исправить прямо в php, например, в файле конфигурации вашего проекта.

ini_set('xdebug.max_nesting_level', 200);

12 голосов
/ 23 ноября 2015

Перейдите в файл конфигурации php.ini и измените следующую строку:

xdebug.max_nesting_level=100

что-то вроде:

xdebug.max_nesting_level=200
12 голосов
/ 06 марта 2014

Попробуйте поискать в /etc/php5/conf.d/, чтобы увидеть, существует ли файл с именем xdebug.ini

max_nesting_level равен 100 по умолчанию

Если он не установлендобавьте файл:

xdebug.max_nesting_level=300

в конец списка, чтобы он выглядел следующим образом

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

, затем вы можете использовать @ Andrey's тест до и после этогоизмените, чтобы увидеть, работает ли.

php -r 'function foo() { static $x = 1; echo "foo ", $x++, "\n"; foo(); } foo();'
12 голосов
/ 25 июля 2013

возможно произошло из-за xdebug.

Попробуйте прокомментировать следующую строку в "php.ini" и перезапустите сервер, чтобы перезагрузить PHP.

";xdebug.max_nesting_level"

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

в Ubuntu с использованием PHP 5.59:
добрался до `:

/ etc / php5 / cli / conf.d

и найдите свой xdebug.ini в этом каталоге, в моем случае это 20-xdebug.ini

и добавьте эту строку `

xdebug.max_nesting_level = 200


или это

xdebug.max_nesting_level = -1

установите его на -1, и вам не нужно беспокоиться об изменениизначение уровня вложенности.

`

...