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



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



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




неустранимая ошибка: достигнут максимальный уровень вложенности функции '100' ,
аборт! в
D:wampwwwcrawler1simplehtmldom_1_5simple_html_dom.php on line
1355




ERROR



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



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




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



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




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

1397   21  

21 ответов:

увеличить значение xdebug.max_nesting_level в вашем php.ini:http://xdebug.org/docs/all_settings#max_nesting_level

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

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

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

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

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

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

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

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

xdebug.max_nesting_level=500

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

ini_set('xdebug.max_nesting_level', 200);

вероятно, это произошло из-за xdebug.

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

";xdebug.max_nesting_level"

попробуйте заглянуть в /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

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

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

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

xdebug.max_nesting_level=100

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

xdebug.max_nesting_level=200

на 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 и вам не придется беспокоиться измените значение уровня вложенности.

'

php.ini:

xdebug.max_nesting_level = -1

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

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

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

вы можете преобразовать рекурсивный код в итерационный код, который имитирует рекурсию. Это означает, что вы должны нажать текущий статус (url, документ, Позиция в документе и т. д.) в массив, когда вы достигнете ссылки, и вытащите ее из массива, когда эта ссылка закончится.

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

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

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

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

composer update

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

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

С. П. изменить 9999 любой номер, который вы хотите.

У меня была ошибка, когда я устанавливал много плагинов, поэтому ошибка 100 показала, включая местоположение последнего плагина, который я установил C:\wamp\www\mysite\wp-content\plugins\"..."поэтому я удалил эту папку плагина на диске C: тогда все вернулось к норме.Я думаю, что мне нужно ограничить количество плагинов, которые я устанавливаю или активировал .удачи я надеюсь, что это поможет

в вашем случае это определенно экземпляр искателя имеет больше ограничений 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

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

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

другое решение, если вы используете PHP-скрипт в CLI(УМК)

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

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

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

вы также можете изменить функцию {debug} в модификаторе.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 и так далее. Поскольку это проблема smarty, а не Xdebug!

Comments

    Ничего не найдено.