【问题标题】:Symfony2 and Twig render performance issuesSymfony2 和 Twig 渲染性能问题
【发布时间】:2012-04-09 09:26:31
【问题描述】:

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

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

我完全理解 prod 模式没有问题,但开发时显然不舒服。 那么,有人知道在开发模式下使用“render”标签时有什么方法可以摆脱任何无用的调用、日志或代码吗?

【问题讨论】:

    标签: performance symfony render twig


    【解决方案1】:

    我在 10 小时前有 explained。长话短说:迁移到 Twig 扩展。

    【讨论】:

    • 好吧,在这种情况下,为控制器逻辑创建服务更好恕我直言。如果控制器逻辑有 db 操作,那么我认为最好不要将逻辑移动到 twig 函数。如果嵌入式控制器附加了路由并且可以独立调用,则创建单独的服务还可以确保可重用性。
    • 没有什么能阻止您从 Twig 扩展程序调用服务。事实上,这就是我所做的。这不是这个-VS-那个问题。我的 Twig 扩展只调用定义为服务的控制器的操作。这些操作无需 Twig 扩展即可重用。
    • 那么服务也可以通过在app/config.yml 中添加 twig 全局变量来暴露给 twig。只是完成事情的方式不同。实际上没有什么可争论的:)。
    • 所以我们应该避免在 Symfony2 中嵌入控制器?就这种机制非常有用且易于使用而言,这令人非常失望......
    • 如何用树枝扩展替换渲染?
    【解决方案2】:

    我最喜欢 symfony 中的一个特性是渲染标签,嵌入控制器调用。探查器给每个控制器调用增加了很多开销,不仅速度,而且使用大量内存。您有几个选项可以加快速度。

    探查器默认将每个数据写入一个 sqlite 数据库。 IIRC sqlite 不允许并行插入,因此每个请求都必须等待轮到他们访问数据库以刷新数据收集器。您可以使用您的开发数据库(mysql 或您使用的任何东西)来保存分析器数据。一年前,我在速度方面收获颇丰。

    您还可以为子请求禁用分析器,或者仅在发生异常时使用分析器。详情请参阅the framework config reference

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

    【讨论】:

    • 我有prbl使用render_esi();在这种情况下@m2mdas 解决方案不可行。
    • 在 yml 文件中您将使用什么字符串来代替 MySQL 数据库?
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      选择取决于您的应用程序。我认为最实用的方法是:

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

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

      【讨论】:

        【解决方案5】:

        我也会按照 Elnur 的建议来扩展树枝。另一种方法是使用 Sonata Block Bundle:http://sonata-project.org/bundles/block/master/doc/index.html。 Sonata Block 子请求的开销大约是 7 毫秒。

        【讨论】:

          猜你喜欢
          • 2014-03-26
          • 2014-06-26
          • 1970-01-01
          • 1970-01-01
          • 2015-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多