【问题标题】:Increasing nesting function calls limit增加嵌套函数调用限制
【发布时间】:2011-05-16 16:17:40
【问题描述】:

PHP 中有一个非常糟糕的限制:如果你调用某个函数 a1(),它调用 a2(),它调用 a3...所以当 a99() 调用 a100() 时,你会看到

致命错误:达到“100”的最大函数嵌套级别,正在中止!

有没有办法将嵌套调用的 100 次限制增加到 500 或 10000 次?

这对我来说很重要,因为我正在开发一个包含大量回调的基于事件的系统。

【问题讨论】:

  • 100 似乎有点过分,即使对于事件框架也是如此。
  • @Ignacio:即使重点是事件框架,也很简单,具有需要更高嵌套级别的递归函数。数万(甚至数百万)在这种情况下并不少见。
  • stackoverflow.com/a/36440027/2652524我用这个答案解决了我的问题
  • @IgnacioVazquez-Abrams 如果您正在执行函数式编程而不是面向对象或过程式编程,那么 100 很容易成为杯水车薪。考虑到该领域的许多 PHD 建议使用函数式而不是 OOP 或 proc,实际上,您应该始终准备好拥有大量递归函数。

标签: php xdebug


【解决方案1】:

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

xdebug.max_nesting_level = 200

或在您的 PHP 代码中:

ini_set('xdebug.max_nesting_level', 200);

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

【讨论】:

  • 我遇到了同样的问题。我的 max_nesting_level 设置为 100,但在我的情况下,在某些情况下,可能有 1000 个递归调用。所以,我设置为 10000 以避免这个 xdebug 错误。在任何情况下,总比让 PHP 不受限制地好。
  • 如果您的 php.ini 中没有此 xdebug.max_nesting_level = 100 选项,只需将其粘贴进去即可。
  • @Pedram 在 php ini 文件中复制它的正确方法是在 /etc/php5/apache2/conf.d/20-xdebug.ini 中,而不是在普通的 php.ini 中。只是一个好习惯
  • @EnriqueQuero 取决于系统和操作系统。
  • 有效!不管你有没有使用XDebug,也不管你在php.ini 中注释掉一行。我明确使用了:ini_set('xdebug.max_nesting_level', -1);
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我个人认为这是一个错误,而不是需要调整的设置。在我的代码中,这是因为我有一个与我的一个控制器中的库同名的类,它似乎把它绊倒了。

    输出错误并查看触发的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多