2012-03-25 117 views
8

就像in this topic,在我的应用中添加枝条“render”标记时,我在dev模式下出现性能问题(相关文档:Embedding controllers)。Symfony2和Twig渲染性能问题

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

我完全理解prod模式没有问题,但显然在开发过程中并不舒服。 那么,有人知道任何方式来摆脱任何无用的调用,日志或代码,而在开发模式使用“渲染”标签?

回答

8

我有explained它只是10小时前。长话短说:迁移到枝条扩展。

+2

那么在这种情况下,为控制器逻辑创建一个服务是更好的恕我直言。如果控制器逻辑具有数据库操作,那么我认为最好不要将逻辑移动到枝功能。如果嵌入式控制器具有附加的路由并且可以独立调用,则创建单独的服务也可确保可用性。 – 2012-03-25 20:41:32

+0

没有什么能阻止你从枝条延伸的呼叫服务。事实上,这就是我所做的。这不是一个这个VS的问题。我的Twig扩展只是调用定义为服务的控制器的动作。这些操作可以在没有Twig扩展的情况下重用。 – 2012-03-25 20:52:45

+1

那么这个服务也可以通过在'app/config.yml'中添加一个全局变量来暴露给树枝。完成不同的事情。没有什么可以争论的:)。 – 2012-03-25 21:04:22

8

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 
+0

我有prbl使用render_esi();在这种情况下,@ m2mdas解决方案是不可行的。 – lrkwz 2015-11-11 13:24:53

+0

这确实是一个有趣的技巧:-) – MauganRa 2016-08-31 10:33:36

2

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

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

2)按照m2mdas的提议进行。这是常见情况下非常快速的解决方案。