Я создал функцию, которая находит все 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?
Ответы:
Увеличьте значение
xdebug.max_nesting_level
в вашемphp.ini
источник
xdebug.max_nesting_level = -1
Простое решение решило мою проблему. Я только что прокомментировал эту строку:
в моем
php.ini
файле. Это расширение ограничивало стек,100
поэтому я отключил его. Рекурсивная функция теперь работает как положено.источник
Вместо того, чтобы использовать рекурсивные вызовы функций, работайте с моделью очереди, чтобы сгладить структуру.
Есть разные способы справиться с этим. Вы можете отслеживать дополнительную информацию, если вам нужно немного узнать о происхождении или пройденных путях. Существуют также распределенные очереди, которые могут работать по аналогичной модели.
источник
Другое решение - добавить
xdebug.max_nesting_level = 200
в свой php.iniисточник
ini_set('xdebug.max_nesting_level', 200);
Вместо того, чтобы отключить xdebug, вы можете установить более высокий предел, как
источник
Это также можно исправить прямо в php, например, в файле конфигурации вашего проекта.
ini_set('xdebug.max_nesting_level', 200);
источник
Перейдите в файл конфигурации php.ini и измените следующую строку:
что-то вроде:
источник
в Ubuntu с использованием PHP 5.59
:
и найдите ваш xdebug.ini в этом каталоге , в моем случае это 20-xdebug.ini
и добавьте эту строку
или это
установите его на -1, и вам не нужно беспокоиться об изменении значения уровня вложенности.
`
источник
вероятно произошло из-за xdebug.
Попробуйте прокомментировать следующую строку в вашем «php.ini» и перезапустите сервер, чтобы перезагрузить PHP.
";xdebug.max_nesting_level"
источник
Попробуйте поискать в /etc/php5/conf.d/, чтобы увидеть, есть ли файл с именем xdebug.ini
по умолчанию max_nesting_level равен 100
Если он не установлен в этом файле, добавьте:
до конца списка, так это выглядит так
Затем вы можете использовать тест @ Andrey до и после внесения этого изменения, чтобы проверить, сработало ли оно.
источник
.ini
файл. Кстати, когда вы запускаете php5-fpm, этот файл, вероятно, где-то здесь:/etc/php5/fpm/conf.d/20-xdebug.ini
php.ini:
Я не совсем уверен, будет ли значение когда-либо переполнено и достигнет -1, но оно либо никогда не достигнет -1, либо установит max_nesting_level довольно высоким.
источник
Вы можете преобразовать свой рекурсивный код в итеративный код, который имитирует рекурсию. Это означает, что вы должны помещать текущее состояние (URL, документ, положение в документе и т. Д.) В массив при достижении ссылки и извлекать ее из массива после завершения этой ссылки.
источник
Вы можете попытаться развернуть вложенность путем реализации параллельных рабочих (например, в кластерных вычислениях) вместо увеличения количества вызовов вложенных функций.
Например: вы определяете ограниченное количество слотов (например, 100) и отслеживаете количество «рабочих», назначенных каждому / некоторым из них. Если какие-либо слоты становятся свободными, вы помещаете ожидающих работников «в них».
источник
Проверьте рекурсию из командной строки:
если результат> 100 ТО, проверьте лимит памяти;
источник
Если вы используете Laravel, сделайте
Это должно быть работой.
источник
PS Измените 9999 на любой номер, который вы хотите.
источник
У меня была ошибка, когда я устанавливал много плагинов. Итак, ошибка 100 показала, включая местоположение последнего плагина, который я установил C: \ wamp \ www \ mysite \ wp-content \ plugins \ "...", поэтому я удалил этот плагин папка на диске C: тогда все вернулось к нормальному состоянию. Я думаю, что мне нужно ограничить количество подключаемых модулей, которые я установил или активировал. Удачи, я надеюсь, это поможет
источник
В вашем случае это определенно, что у экземпляра сканера больше предела Xdebug для отслеживания ошибок и отладочной информации.
Но в других случаях такие ошибки, как в PHP или основных файлах, таких как библиотеки CodeIgniter, создадут такой случай, и если вы даже увеличите настройку уровня x-debug, она не исчезнет.
Итак, внимательно изучите ваш код :).
Здесь была проблема в моем случае.
У меня был класс обслуживания, который является библиотекой в CodeIgniter. Имея функцию внутри, как это.
Мой контроллер следующим образом:
Вызов функции в последней строке был неправильным из-за опечатки, вместо этого он должен был выглядеть так:
Затем я продолжал получать сообщение об ошибке превышения. Но я отключил XDebug, но не помог. В любом случае, пожалуйста, проверьте имя класса или код для правильного вызова функции.
источник
У меня была эта проблема с WordPress на cloud9. Оказывается, это был плагин W3 Caching. Я отключил плагин, и он работал нормально.
источник
Другое решение, если вы запускаете php скрипт в CLI (cmd)
Файл php.ini, который нужно редактировать, отличается в этом случае. В моей установке WAMP файл php.ini, который загружается в командной строке:
вместо \ wamp \ bin \ apache \ apache2.4.9 \ bin \ php.ini, который загружается при запуске php из браузера
источник
Вы также можете изменить функцию {debug} в modifier.debug_print_var.php, чтобы ограничить ее рекурсию в объекты.
Вокруг линии 45, до:
После :
Таким образом, Xdebug будет по-прежнему вести себя нормально: ограничить глубину рекурсии в var_dump и так далее. Так как это умная проблема, а не проблема Xdebug!
источник
У меня была такая же проблема, и я решаю вот так:
Откройте файл MySQL my.ini
В разделе [mysqld] добавьте следующую строку: innodb_force_recovery = 1
Сохраните файл и попробуйте запустить MySQL
Удалите ту строку, которую вы только что добавили, и сохраните
источник