今天在安装一个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行开始:
代码如下:
XG(level)++;
if (XG(level) == XG(max_nesting_level)) {
php_error(E_ERROR, "Maximum function nesting level of '%ld' reached,
aborting!", XG(max_nesting_level));
}
之前的函数嵌套的层数限制是xdebug扩展加上的,为什么会有这个限制了呢?在xdebug中,xdebug中会记录每次函数调用, 包括嵌套的函数调用,函数调用中的内存,时间等值,这些值在分析程序性能时有大用。如果没有这个限制,当嵌套的层数太多,机器会内存耗尽。 如果这是一台生产环境的服务器,那么就会有部分服务不可用,当然生产环境下是不会添加这个扩展的。但是在多人共用的开发服务器上就可能有这个扩展, 如果因为一个开发人员的程序错误导致机器不可用,从而使所有的开发人员不能工作,我想这也许是添加限制的原因吧。
如果我们需要把这个限 制的层数加大,怎么办呢?改源码,重新编译xdebug扩展?不需要,在xdebug的配置项中有一项叫做 xdebug.max_nesting_level, 默认情况下,在php.ini中这个配置项是被注释了的,去掉注释,将这个值成你所需要的值,但是这个值还是不要太大, 如果递归太多,对程序的性能有很大的影响,此时,以栈的形式实现递归或者用循环替换递归会是一个更好的方案, 如:斐波那契数列(Fibonacci)的实现,用循环来实现会更快。
结论:PHP本身的函数嵌套是没有限制的,如果说有限制,也是内存的限制。这是因为PHP的函数嵌套是以栈的形式实现的。对于每个函数都会分配一段内存来存储函数局部的内容。