Решение для "фатальной ошибки:максимальный уровень вложенности функции" 100 " достигнут, прерывание!" в PHP
Я создал функцию, которая находит все URL-адреса в html-файле и повторяет один и тот же процесс для каждого содержимого html, связанного с обнаруженными URL-адресами. Функция рекурсивна и может продолжаться бесконечно. Однако я поставил ограничение на рекурсию, установив глобальную переменную, которая заставляет рекурсию останавливаться после 100 рекурсий.
однако php возвращает эту ошибку:
неустранимая ошибка: достигнут максимальный уровень вложенности функции '100' ,
аборт! в
D:wampwwwcrawler1simplehtmldom_1_5simple_html_dom.php on line
1355

Я нашел решение здесь: увеличение ограничения вызовов функций вложенности, но это не работает в моем случае.
я цитирую один из ответов по ссылке, упомянутой выше. Пожалуйста, подумайте об этом.
" У вас установлен Zend, IonCube или xDebug? Если так, то, вероятно, где вы получаете эту ошибку.
Я столкнулся с этим несколько лет назад, и это закончилось тем, что Zend поставил там этот предел, а не PHP. Конечно, удаление его позволит >вам пройти 100 итераций, но в конечном итоге вы попадете в пределы памяти."
есть ли способ увеличить максимальный уровень вложенности функций в PHP
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, вы можете установить более высокий предел, как
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, то проверьте ограничение памяти;
<?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(' ', $depth * 2) . '<b> ->' . strtr($curr_key, $_replace) . '</b> = ' . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);после :
$max_depth = 10; $results .= '<br>' . str_repeat(' ', $depth * 2) . '<b> ->' . 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