解决scheme“致命错误:最大function嵌套级别达到100,中止!”在PHP中

我已经做了一个function,find一个HTML文件中的所有url,并重复每个链接到发现的url的HTML内容相同的过程。 这个函数是recursion的,可以继续下去。 但是,我已经通过设置一个全局variables来限制recursion,导致recursion在100次recursion之后停止。

但是,PHP返回这个错误:

致命错误:达到“100”的最大function嵌套级别,正在中止! 在1355行D:\ wamp \ www \ crawler1 \ simplehtmldom_1_5 \ simple_html_dom.php

错误

我在这里find了一个解决scheme: 增加嵌套函数调用限制,但这不适用于我的情况。

我引用上面提到的链接中的一个答案。 请考虑一下。

“您是否安装了Zend,IonCube或xDebug?如果是这样,那可能是您从这个错误中得到的。

几年前,我遇到了这个问题,最终Zend把这个限制放在那里,而不是PHP。 当然,删除它会让你超过100次迭代,但是你最终会达到内存限制。“

有没有办法来增加PHP中的最大function嵌套级别

在php.ini中增加xdebug.max_nesting_level的值: http ://xdebug.org/docs/all_settings#max_nesting_level

简单的解决scheme解决了我的问题 我刚刚评论过这一行:

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

在我的php.ini文件中。 这个扩展将堆栈限制为100所以我禁用了它。 recursion函数现在按照预期工作。

而不是进行recursion函数调用,使用队列模型来扁平化结构。

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

有不同的方法来处理它。 如果您需要关于所穿过的原点或path的一些信息,则可以跟踪更多的信息。 还有分布式队列可以解决类似的模型。

另一个解决scheme是在php.ini中添加xdebug.max_nesting_level = 200

而不是禁用xdebug,你可以设置更高的限制

xdebug.max_nesting_level = 500

也可以直接在php中解决这个问题,例如在项目的configuration文件中。

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 

你可以使用@安德烈的testing之前和之后做这个改变,看看是否工作。

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

进入你的php.iniconfiguration文件,并更改以下行:

 xdebug.max_nesting_level=100 

像这样的东西:

 xdebug.max_nesting_level=200 

在Ubuntu上使用PHP 5.59:
得到`:

/etc/php5/cli/conf.d

并find你的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),并监视分配给每个/部分插槽的“工作人员”的数量。 如果有空位,你就把等待的工人“放在里面”。

你可以将你的recursion代码转换成迭代代码,它可以模拟recursion。 这意味着当你到达一个链接时,你必须将当前的状态(url,文档,文档等中的位置)推送到一个数组中,当这个链接完成时,把它从数组中popup。

从命令行检查recursion:

 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:驱动器,然后一切都恢复正常。我想我必须限制插件的数量,我安装或已激活。好运气,我希望它可以帮助

我在cloud9的WordPress上遇到了这个问题。 原来这是W3caching插件。 我禁用了插件,它工作正常。

另一个解决scheme,如果你正在CLI(CMD)运行PHP脚本

在这种情况下需要编辑的php.ini文件是不同的。 在我的WAMP安装中,在命令行中加载的php.ini文件是:

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

而不是\ wamp \ bin \ apache \ apache2.4.9 \ bin \ php.ini当php从浏览器运行时加载

您还可以修改modifier.debug_print_var.php中的{debug}函数,以限制其recursion到对象中。

在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中限制recursion深度,等等。 因为这是一个聪明的问题,而不是一个Xdebug!

在你的情况下,绝对是爬虫实例有更多的Xdebug限制来跟踪错误和debugging信息。

但是,在其他情况下,像PHP或CodeIgniter库等核心文件的错误也会造成这种情况,如果您甚至增加了x-debug级别设置,它也不会消失。

所以,仔细看看你的代码:)。

这是我的情况。

我有一个服务类是CodeIgniter中的库。 有这样的function。

  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,但没有帮助。 任何方式请检查您的类名称或您的代码进行正确的函数调用。