Solution for “Fatal error: Maximum function nesting level of '100' reached, aborting!” in PHP

匿名 (未验证) 提交于 2019-12-03 02:11:02

问题:

I have made a function that finds all the URLs within an html file and repeats the same process for each html content linked to the discovered URLs. The function is recursive and can go on endlessly. However, I have put a limit on the recursion by setting a global variable which causes the recursion to stop after 100 recursions.

However, php returns this error:

Fatal error: Maximum function nesting level of '100' reached, aborting! in D:\wamp\www\crawler1\simplehtmldom_1_5\simple_html_dom.php on line 1355

I found a solution here: Increasing nesting function calls limit but this is not working in my case.

I am quoting one of the answers from the link mentioned above. Please do consider it.

"Do you have Zend, IonCube, or xDebug installed? If so, that is probably where you are getting this error from.

I ran into this a few years ago, and it ended up being Zend putting that limit there, not PHP. Of course removing it will let >you go past the 100 iterations, but you will eventually hit the memory limits."

Is there a way to increase the maximum function nesting level in PHP

回答1:

Increase the value of xdebug.max_nesting_level in your php.ini: http://xdebug.org/docs/all_settings#max_nesting_level



回答2:

A simple solution solved my problem. I just commented this line:

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

in my php.ini file. This extension was limiting the stack to 100 so I disabled it. The recursive function is now working as anticipated.



回答3:

Rather than going for a recursive function calls, work with a queue model to flatten the structure.

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

There are different ways to handle it. You can keep track of more information if you need some insight about the origin or paths traversed. There are also distributed queues that can work off a similar model.



回答4:

Another solution is to add xdebug.max_nesting_level = 200 in your php.ini



回答5:

Rather than disabling the xdebug, you can set the higher limit like

xdebug.max_nesting_level=500



回答6:

It's also possible to fix this directly in php, for example in the config file of your project.

ini_set('xdebug.max_nesting_level', 200);



回答7:

probably happened because of xdebug.

Try commenting the following line in your "php.ini" and restart your server to reload PHP.

";xdebug.max_nesting_level"



回答8:

Go into your php.ini configuration file and change the following line:

xdebug.max_nesting_level=100 

to something like:

xdebug.max_nesting_level=200 


回答9:

Try looking in /etc/php5/conf.d/ to see if there is a file called xdebug.ini

max_nesting_level is 100 by default

If it is not set in that file add:

xdebug.max_nesting_level=300 

to the end of the list so it looks like this

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 

you can then use @Andrey's test before and after making this change to see if worked.

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


回答10:

on Ubuntu using PHP 5.59 :
got to `:

/etc/php5/cli/conf.d

and find your xdebug.ini in that dir, in my case is 20-xdebug.ini

and add this line `

xdebug.max_nesting_level = 200


or this

xdebug.max_nesting_level = -1

set it to -1 and you dont have to worry change the value of the nesting level.

`



回答11:

php.ini:

xdebug.max_nesting_level = -1

I'm not entirely sure if the value will ever overflow and reach -1, but it'll either never reach -1, or it'll set the max_nesting_level pretty high.



回答12:

You could try to wiggle down the nesting by implementing parallel workers (like in cluster computing) instead of increasing the number of nesting function calls.

For example: you define a limited number of slots (eg. 100) and monitor the number of "workers" assigned to each/some of them. If any slots become free, you put the waiting workers "in them".



回答13:

You could convert your recursive code into an iterative code, which simulates the recursion. This means that you have to push the current status (url, document, position in document etc.) into an array, when you reach a link, and pop it out of the array, when this link has finished.



回答14:

Check recursion from command line:

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

if result > 100 THEN check memory limit;



回答15:

If you're using Laravel, do

composer update 

This should be work.



回答16:

I had a error when i was installing many plugins So the error 100 showed including the location of the last plugin that i installed C:\wamp\www\mysite\wp-content\plugins\"..." so i deleted this plugin folder on the C: drive then everything was back to normal.I think i have to limit the amount of plug-in i install or have activated .good luck i hope it helps



回答17:

I had this issue with WordPress on cloud9. It turns out it was the W3 Caching plugin. I disabled the plugin and it worked fine.



回答18:

Another solution if you are running php script in CLI(cmd)

The php.ini file that needs edit is different in this case. In my WAMP installation the php.ini file that is loaded in command line is:

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

instead of \wamp\bin\apache\apache2.4.9\bin\php.ini which loads when php is run from browser



回答19:

You can also modify the {debug} function in modifier.debug_print_var.php, in order to limit its recursion into objects.

Around line 45, before :

After :

This way, Xdebug will still behave normally: limit recursion depth in var_dump and so on. As this is a smarty problem, not a Xdebug one!



回答20:

In your case it's definitely the crawler instance is having more Xdebug limit to trace error and debug info.

But, in other cases also errors like on PHP or core files like CodeIgniter libraries will create such a case and if you even increase the x-debug level setting it would not vanish.

So, look into your code carefully :) .

Here was the issue in my case.

I had a service class which is library in CodeIgniter. Having a function inside like this.

 class PaymentService {      private $CI;      public function __construct() {          $this->CI =& get_instance();     }    public function process(){    //lots of Ci referencing here...    } 

My controller as follow:

$this->load->library('PaymentService'); $this->process_(); // see I got this wrong instead  it shoud be like  

Function call on last line was wrong because of the typo, instead it should have been like below:

$this->Payment_service->process(); //the library class name 

Then I was keeping getting the exceed error message. But I disabled XDebug but non helped. Any way please check you class name or your code for proper function calling.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!