【问题标题】:What is causing a "Maximum function nesting level" error in Symfony 2.1 and Twig?是什么导致 Symfony 2.1 和 Twig 中的“最大函数嵌套级别”错误?
【发布时间】:2018-06-17 06:16:31
【问题描述】:

我有一个关于 Symfony 2.1 的项目。更新作曲家组件(Gedemo、Symfony 核心、Doctrine、Twig 等)后,出现以下错误:

Fatal error: Maximum function nesting level of '100' reached, aborting! in /var/www/{path}/vendor/twig/twig/lib/Twig/Token.php on line 78

我有 PHP 5.4。什么可能导致此错误?

【问题讨论】:

  • 可能您的视图中某处有太多循环。你应该分析你的代码,检查和重构逻辑。好的开始可能是分析该错误中的函数跟踪
  • @thecatontheflat,实际上,在开发环境中的 Twig 中渲染表单时,通常情况下会发生这种情况。
  • @elnur 很高兴知道,谢谢 :)
  • 如果你想扩大你的答案,我很乐意恢复它并重新打开这个问题。
  • 尽管我很喜欢这个问题,但没有一个给出的答案实际上给出了关于在哪里寻找降低 Twig 嵌套级别或如何调试它的提示。增加嵌套级别并不能解决此问题的原因。

标签: symfony twig


【解决方案1】:

找到xdebug.ini 文件:

$ locate xdebug.ini
/etc/php5/conf.d/20-xdebug.ini
/etc/php5/mods-available/xdebug.ini

在我的例子中,文件是/etc/php5/conf.d/20-xdebug.ini。打开它并添加这一行:

xdebug.max_nesting_level = 1000

别忘了重启 FPM 服务器。

【讨论】:

  • 什么是 FPM 服务器。你只需要重启apache吗?
  • @Robbo_UK,如果您使用的是 Apache 和 mod_php,那么是的,重新启动 Apache 服务器。 PHP-FPM 是运行 PHP 的现代方式。
  • 在尝试使用 Laravel 5 运行代码接收测试时遇到了同样的错误,这解决了它
  • 很抱歉看起来像个顽固分子,但您也可以回答问题的What is causing 部分吗?如果你能解释一下,我会很感兴趣。谢谢!
  • @BartaTamás :检查您的模板继承,因为这与树枝有关。可能导致问题的原因是在您的包中覆盖模板并同时扩展父包模板。
【解决方案2】:

这是一个导致无限循环的错误代码,但有时会发生无错误的处理超过 100 个调用嵌套函数。

要更正此问题,请打开 php.ini、xdebug 部分并添加以下行(输入你想要的而不是 150)

 [xdebug]
xdebug.max_nesting_level = 150

【讨论】:

  • 不建议设置像 10000 这样的非常大的数字,因为它可能会冻结您的计算机。如果你用 1000 不能解决你的问题,那么你的脚本很可能有问题。
  • 我同意 Shehi 的观点,例如函数 A 调用函数 B,函数 B 调用函数 A - 这将导致无限嵌套循环,这是您需要使用跟踪/中断来解决的逻辑错误在调试模式下或删除代码块以快速找出问题。尝试在此问题发生之前删除您刚刚添加的代码,您会看到。
  • 但是 symfony 表单会生成循环数,这将在 windows 中生成此类错误我已增加此值以更正问题
【解决方案3】:

只是向可能有兴趣了解问题的“是什么原因..”部分的新 Twig 开发人员分享一些小技巧。

显然,在原始问题中,最大嵌套级别相当低 (100),正如一些 cmets 所提到的,对于正常情况而言,它可能太低了。

但是,如果按照上面的建议将级别提高到 256、512 甚至 1000 并且仍然遇到相同的错误,那么可能最有可能查看的是the template inheritance。 (模板第一行的extends关键字)

对于在多个位置有模板的项目尤其如此。

想象一个示例项目结构:

── plugins
   ├── your-plugin
   |   ├── views
   |   │   ├── base.twig
   │   │   ├── special-element.twig
   │   │   ├── some-other-element.twig
── theme
   ├── base.twig
   ├── index.twig
   ├── sub-page.twig

插件有一个模板base.twig,它扩展了主题下的base.twig。但如果模板位置配置不正确,模板可能会一次又一次地扩展自身,从而导致无限循环。

如何检查是否是这种情况?我很高兴听到更准确的解决方案,但可以开始 - 仅用于调试目的 - 就像引用具有完整服务器路径的父模板一样简单:

{% extends "/var/www/path-to-your-template/" %}

如果它开始使用绝对路径,那么您可以确定模板路径有问题。在此处阅读更多信息:Twig Template Naming and Locations

【讨论】:

    【解决方案4】:

    如果增加xdebug.max_nesting_level = 1000失败检查命名空间是否正确

    例如:namespace App\Entities; 但文件夹名称为小写 app

    那么实体应该包含命名空间namespace app\Entities;

    【讨论】:

      【解决方案5】:

      就我而言,我不得不将 php.ini 中 PHP 使用的内存量增加到 512MB。另外,我在站点根文件夹上做了 composer update 来更新 Symfony 生成的默认设置。

      【讨论】:

        猜你喜欢
        • 2016-10-14
        • 1970-01-01
        • 1970-01-01
        • 2019-08-14
        • 2019-11-27
        • 1970-01-01
        • 2014-04-10
        • 2011-07-03
        • 1970-01-01
        相关资源
        最近更新 更多