解决方案"致命错误:达到'100'的最大功能嵌套级别,正在中止!" 用PHP

Raf*_*fay 133 php recursion xdebug

我创建了一个函数来查找html文件中的所有URL,并为链接到发现的URL的每个html内容重复相同的过程.该函数是递归的,可以无休止地继续.但是,我通过设置一个全局变量来限制递归,该变量导致递归在100次递归后停止.

但是,php会返回此错误:

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

错误

我在这里找到了一个解决方案:增加嵌套函数调用限制但这在我的情况下不起作用.

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

"你是否安装了Zend,IonCube或xDebug?如果是这样的话,那可能是你从这里得到这个错误的地方.

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

有没有办法增加PHP中的最大函数嵌套级别

Max*_*nce 144

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

  • @AL您可以编辑php.ini文件,并在XDebug部分添加或编辑xdebug.max_nesting_level行. (5认同)
  • 这解决了症状(暂时),但不是问题. (3认同)
  • 无限:xdebug.max_nesting_level = -1 (3认同)
  • 但是,如果这是生产环境,请参阅接受的答案,即在该环境中禁用xdebug. (2认同)

Raf*_*fay 54

一个简单的解决方案解决了我 我刚评论过这一行:

zend_extension = "d:/wamp/bin/php/php5.3.8/zend_ext/php_xdebug-2.1.2-5.3-vc9.dll
Run Code Online (Sandbox Code Playgroud)

在我的php.ini档案中.这个扩展是限制堆栈,100所以我禁用它.递归函数现在正如预期的那样工作.

  • 处理过度递归肯定比关闭监控更好. (57认同)
  • 这是一种严厉的做法.上述答案提到调整最大堆栈深度的变量是一种更好的方法. (7认同)
  • 您没有在生产环境中启用xdebug. (7认同)
  • 所以,最终它毕竟是XDebug扩展......很高兴知道.在两天内,您可以接受自己的答案作为已接受的答案,如果您愿意(并查看您之前的问题,大多数人会错过接受的答案). (4认同)
  • 哇靠。我无法停止对所选解决方案的嘲笑。因此,我的PC不会停止发出噪音,因此我找到了解决方案。把它关掉。:) (2认同)

Lou*_*eau 44

而不是进行递归函数调用,使用队列模型来展平结构.

$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;
}
Run Code Online (Sandbox Code Playgroud)

有不同的方法来处理它.如果您需要了解所遍历的原点或路径,您可以跟踪更多信息.还有分布式队列可以使用类似的模型.

  • 使用SPL,您无需重新发送队列:http://php.net/manual/en/class.splqueue.php (5认同)

小智 41

另一个解决方案是添加xdebug.max_nesting_level = 200你的php.ini

  • 它也可以在php中完成,例如在项目的配置文件中.```ini_set('xdebug.max_nesting_level',200); ``` (7认同)

小智 23

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

xdebug.max_nesting_level = 500

  • 几年前这个答案已经不是吗? (3认同)

sva*_*ssr 18

也可以直接在php中修复它,例如在项目的配置文件中.

ini_set('xdebug.max_nesting_level', 200);


小智 13

进入php.ini配置文件并更改以下行:

xdebug.max_nesting_level=100
Run Code Online (Sandbox Code Playgroud)

类似于:

xdebug.max_nesting_level=200
Run Code Online (Sandbox Code Playgroud)


Guj*_*ana 13

在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,您不必担心更改嵌套级别的值.

`


van*_*ndf 12

可能是因为xdebug而发生的.

尝试在"php.ini"中注释以下行并重新启动服务器以重新加载PHP.

  ";xdebug.max_nesting_level"

  • 或禁用所有xdebug (2认同)
  • 这怎么样?如果您不手动定义限制,它将恢复为默认值,即100(http://xdebug.org/docs/basic).通过对此行进行注释,您所做的一切都会强制设置恢复为默认值. (2认同)

Lee*_*man 12

尝试查看/etc/php5/conf.d/以查看是否存在名为xdebug.ini的文件

max_nesting_level默认为100

如果未在该文件中设置添加:

xdebug.max_nesting_level=300
Run Code Online (Sandbox Code Playgroud)

到列表末尾所以它看起来像这样

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
Run Code Online (Sandbox Code Playgroud)

然后,您可以在进行此更改之前和之后使用@ Andrey的测试以查看是否有效.

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


Mar*_*utt 7

php.ini中:

xdebug.max_nesting_level = -1

我不完全确定该值是否会溢出并达到-1,但它永远不会达到-1,或者它会将max_nesting_level设置得相当高.


tam*_*gal 6

您可以尝试通过实现并行工作(例如在集群计算中)来摆动嵌套,而不是增加嵌套函数调用的数量.

例如:您定义有限数量的插槽(例如100)并监控分配给每个/部分插槽的"工作人员"的数量.如果任何插槽空闲,您将等待的工作人员"放入其中".


Yog*_*ogu 6

您可以将递归代码转换为迭代代码,模拟递归.这意味着当您到达链接时,必须将当前状态(网址,文档,文档中的位置等)推送到数组中,并在此链接完成时将其弹出数组.


And*_*rey 5

从命令行检查递归:

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

如果结果> 100 THEN,则检查内存限制;


cof*_*zak 5

<?php
ini_set('xdebug.max_nesting_level', 9999);
... your code ...
Run Code Online (Sandbox Code Playgroud)

PS 将 9999 更改为您想要的任何数字。