Symfony2和Twig会导致性能问题

时间:2012-03-25 18:02:11

标签: performance symfony render twig

就像in this topic一样,在我的应用中添加twig“render”标记时,我在开发模式下遇到了性能问题(相关文档:Embedding controllers)。

如果没有此渲染标记,我的页面将在不到70毫秒的时间内生成。 使用渲染标记,它至少为170毫秒。 并且在应用程序中添加的每个渲染标记都会使页面生成增加100毫秒(这很多:为什么普通页面在60毫秒内运行,渲染标记在100毫秒内运行?)。 我的应用程序的每个页面上可能需要4或5个,因此在开发模式下每个页面至少需要500毫秒。

我完全理解产品模式没有问题,但在开发中显然不太舒服。 那么,在开发模式下使用“render”标签时,是否有人知道如何摆脱任何无用的调用,日志或代码?

5 个答案:

答案 0 :(得分:9)

symfony中我最喜欢的功能之一是渲染标记,嵌入控制器调用。分析器为每个控制器调用增加了很多开销,不仅速度快,而且占用大量内存。你有几个选择来加快它。

默认情况下,探查器会将每个数据写入sqlite数据库。 IIRC sqlite不允许并行插入,因此每个请求都必须等待轮到他们访问db来刷新数据收集器。您可以使用开发db(mysql或其他任何用途)来保存探查器数据。一年前,我在速度方面获得了很多。

您还可以为子请求禁用探查器,或仅在发生异常时使用探查器。有关详细信息,请参阅the framework config reference

# config_dev.yaml
framework:
    profiler:
        only_exceptions:      false
        only_master_requests: false
        dsn:                  sqlite:%kernel.cache_dir%/profiler.db

答案 1 :(得分:8)

我在10小时前就已经explained了。长话短说:迁移到Twig扩展。

答案 2 :(得分:6)

您可以将控制器逻辑移动到服务并将其作为twig全局变量引用,然后包含控制器呈现的模板。

有关说明,请参阅https://stackoverflow.com/a/13245994/982075

答案 3 :(得分:3)

选择取决于您的申请。我认为最实际的方法是:

1)对于繁重的渲染模板使用render标记,并使用hinclude库以异步方式加载它们。当要呈现的每个模板本身“慢”时(例如,许多数据库连接,大型文本等),这非常有用。

2)按照m2mdas的建议行事。对于常见情况,这是一种非常快速的解决方案。

答案 4 :(得分:0)

我也会通过twig扩展来关注Elnur的建议。另一种方法是使用Sonata Block Bundle:http://sonata-project.org/bundles/block/master/doc/index.html。使用Sonata Block的子请求的开销大约是7ms。