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

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

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

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

ОШИБКА

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

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

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

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

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

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

Увеличьте значение 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 

в моем файле php.ini . Это расширение ограничивало стек до 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"

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

 xdebug.max_nesting_level=100 

к чему-то вроде:

 xdebug.max_nesting_level=200 

Попробуйте найти в файле /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 до и после внесения этого изменения, чтобы убедиться, что он работает.

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

на 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, document, position in document и т. Д.) В массив, когда вы достигнете ссылки, и вытащите его из массива, когда эта ссылка закончится.

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

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

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

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

 composer update 

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

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

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

Другое решение, если вы используете 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 из браузера

Вы также можете изменить функцию {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!

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