增加嵌套函数调用限制


127

PHP中有一个非常糟糕的限制:如果您调用某个调用a2()的函数a1(),又调用了a3 ...,那么何时a99()调用a100()将看到

致命错误:达到最大功能嵌套级别'100',正在中止!

有什么方法可以将100个嵌套调用的限制增加到500或10000吗?

这对我来说至关重要,因为我正在开发一个带有很多回调的基于事件的系统。


12
即使对于事件框架,100似乎也有些多余。
伊格纳西奥·巴斯克斯

7
@Ignacio:这很简单,即使重点放在事件框架上,也具有需要更高嵌套级别的递归函数。在这种情况下,成千上万(甚至数百万)的情况并不罕见。
亚伯

stackoverflow.com/a/36440027/2652524我用这个答案解决了我的问题
Gujarat Santana

Answers:


254

此错误消息专门来自XDebug扩展。PHP本身没有函数嵌套限制。更改您的php.ini中的设置

xdebug.max_nesting_level = 200

或在您的PHP代码中:

ini_set('xdebug.max_nesting_level', 200);

至于您是否真的需要更改它(即:是否有递归函数的替代解决方案),我无法告诉您没有代码。


我有同样的问题。我的max_nesting_level设置为100,但在某些情况下,可能会有1000次递归调用。因此,我设置为10000以避免此xdebug错误。在所有情况下,它总是比让PHP无止境地更好。
SkaJess 2014年

9
如果你没有这个xdebug.max_nesting_level = 100在你的选择的php.ini刚粘贴英寸
M.礼Nasirloo

@Pedram将其复制到php ini文件中的正确方法是在/etc/php5/apache2/conf.d/20-xdebug.ini中,而不是在正常的php.ini中。只是一个好习惯
Enrique Quero 2016年

3
@EnriqueQuero取决于系统和OS。
netcoder '16

有用!不管您是否使用XDebug,都不要在php.ini中注释掉行。我明确使用了:ini_set('xdebug.max_nesting_level',-1);
user2928048'5

13

您是否已安装Zend,IonCube或xDebug?如果是这样,那可能就是您得到此错误的地方。

几年前,我碰到了这个问题,最后是Zend将该限制放在这里,而不是PHP。当然,删除它会使您超过100次迭代,但最终将达到内存限制。


1

我个人认为这是一个错误,而不是需要调整的设置。在我的代码中,这是因为我有一个类与一个控制器中的库具有相同的名称,并且它似乎使它崩溃了。

输出错误,并查看在何处触发。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.