我有一个关于 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。什么会导致此错误?
找到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 服务器。
这是一个导致无限循环的错误代码,但有时会发生无错误的处理超过 100 次调用嵌套函数。
要更正此问题,请打开 php.ini、xdebug 部分并添加以下行(输入您想要的内容而不是 150)
[xdebug]
xdebug.max_nesting_level = 150
只是向可能有兴趣了解问题的“是什么原因......”部分的新 Twig 开发人员分享一些小技巧。
显然,在原始问题中,最大嵌套级别相当低(100),正如一些评论所提到的,对于正常情况来说它可能太低了。
但是,如果按照上面的建议将级别提高到 256、512 甚至 1000 并且仍然遇到相同的错误,那么可能最有可能看到的是模板继承。(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 模板命名和位置
如果增加xdebug.max_nesting_level = 1000
失败的检查命名空间是正确的
例如:namespace App\Entities;
但文件夹名称为小写app
那么实体应该包含命名空间namespace app\Entities;
就我而言,我不得不将php.ini中 PHP 使用的内存量增加到 512MB。此外,我对站点根文件夹进行了composer update以更新 Symfony 生成的默认设置。