今天在安装一个 wordpress 主题的时候,报了这么一个错误。从字面分析,貌似是达到了递归嵌套的上限。google 中找到了答案,原来是 xdebug 引起的。
原文:https://bugs.php.net/bug.php?id=37675 最后一个回答。
解决办法:
关掉 zend_engine
打开 php.ini 找到 zend_extension = “E:/wamp/bin/php/php5.3.5/zend_ext/php_xdebug-2.1.0-5.3-vc6.dll”
在 zend_extension 前加上;即可
重启服务。
更进一步的解释:
是由于 php 函数嵌套层数限制。函数嵌套最常见的就是递归。举个例子
1 | function test() { |
此时会报 Fatal error:Maximum function nesting level of ‘100′ reached, aborting!
在 xdebug 中看到了报错信息。在 xdebug.c 文件的 1242 行开始:
如果我们需要把这个限 制的层数加大,怎么办呢?改源码,重新编译 xdebug 扩展?不需要,在 xdebug 的配置项中有一项叫做 xdebug.max_nesting_level, 默认情况下,在 php.ini 中这个配置项是被注释了的,去掉注释,将这个值成你所需要的值,但是这个值还是不要太大, 如果递归太多,对程序的性能有很大的影响,此时,以栈的形式实现递归或者用循环替换递归会是一个更好的方案, 如:斐波那契数列 (Fibonacci) 的实现,用循环来实现会更快。
结论:PHP 本身的函数嵌套是没有限制的,如果说有限制,也是内存的限制。这是因为 PHP 的函数嵌套是以栈的形式实现的。对于每个函数都会分配一段内存来存储函数局部的内容。