Php 如何在Symfony2中加速模板渲染?
我有一个symfony2应用程序,可以呈现大约6000个数据库实体 我优化了ORM(推进)查询,数据库请求现在非常快。剩下的是symfony控制器和细枝模板渲染引擎 有没有加快渲染速度的方法(例如切换到php模板?) 我可以从symfony profiler中获得更详细的评测信息吗 这里是一个从探查器数据摘录 编辑:我使用xDebug分析了我的代码,发现生成对象非常昂贵。在Php 如何在Symfony2中加速模板渲染?,php,performance,symfony,twig,Php,Performance,Symfony,Twig,我有一个symfony2应用程序,可以呈现大约6000个数据库实体 我优化了ORM(推进)查询,数据库请求现在非常快。剩下的是symfony控制器和细枝模板渲染引擎 有没有加快渲染速度的方法(例如切换到php模板?) 我可以从symfony profiler中获得更详细的评测信息吗 这里是一个从探查器数据摘录 编辑:我使用xDebug分析了我的代码,发现生成对象非常昂贵。在propelObjectFormatter->getAllObjectsFromRow中从数据库行创建数千个PHP对象占用
propelObjectFormatter->getAllObjectsFromRow
中从数据库行创建数千个PHP对象占用了大部分时间
图中显示的分支占用了95%的计算时间,约为2.8秒。
数据库检索耗时约0.5秒,渲染耗时约1秒,格式化耗时最多约1.5秒
我不确定包含PHP类的文件的长度会产生什么影响,但Speep会生成大量代码(我最复杂的实体基类有近10k行代码),因此这也可能会降低对象创建的速度
我认为使用数组格式化程序(从而绕过对象创建步骤)将是一个解决方案,但这在某种程度上违背了ORM的目的。6K的迭代是一项艰巨的工作。 想法#1: 你能实现数据分页吗?这似乎非常合理 Idea#2(厚客户端): 实现一些
JavaScript
模板机制。然后,控制器应返回JSON
,以便JS
遍历并完全渲染它
即使在这种情况下,依靠浏览器的速度快速完成6K循环也是一项艰巨的任务。您需要在两次迭代之间(例如,在每150次迭代之后)实施暂停,以便浏览器不会进入非响应模式。您在这里提出两个问题: 1)如何加速模板渲染? 探查器告诉您,查询是在渲染时铸造的,我认为您忘记了连接,最好在渲染之前执行一个大查询(可能是可缓存的),并且只在视图层中使用查询结果 2)如何获取更详细的分析数据?
我可以建议安装xhprof进行高级评测,您可以使用这个很棒的包:。Xhprof跟踪php调用,并构建时间执行统计数据和可视化调用图。我使用它来检测哪些流程结果必须存储在缓存中。在生产模式下,Symfony2的细枝模板渲染实际上是使用缓存模板完成的,这意味着它是一个PHP模板;编译成纯PHP代码的细枝模板。在开发模式下,它当然不会像那样缓存模板,而是每次编译它。阅读更多关于它的信息 PHP需要一些时间来编译一个包含如此多数据的页面,即使模板只是通常执行速度最快的PHP-HTML注入代码。-您可能希望查看正常的HTTP缓存,例如,如果此页面不是每次都必须从数据库呈现的内容
至于剖析。像这样的东西应该比Symfony2中内置的东西能为您提供更详细的评测信息。基于@jperovic-answer: 正如他所说,您可以创建一个API来抛出JSON数据,并将工作放在客户端。此外,您可能不需要一次显示所有6000个实体?因此,通过ajax调用延迟加载附加数据可能会有所帮助
在数据库端,缓存结果并经常中断缓存,以查看是否有任何新数据。或者,如果数据需要始终保持最新:无论应用程序的哪个部分更新了数据,都会发送一个请求,告诉您的API它应该破坏缓存。听起来您需要使用它,这是针对您的情况而设计的 从文档: 从现在起,Twig将自动编译您的模板以 利用C扩展。请注意,此扩展不存在 替换PHP代码,但只提供优化版本的 Twig_模板::getAttribute()方法
一年前,当我在我的项目中尝试时,我个人几乎没有得到任何明显的影响。如果您使用它,请分享您的体验。我将视图缓存在redis中
渲染视图时,Twig将通过查询获取数据,等待查询需要一些时间。因此,快速显示的方式永远不是查询。在我的项目中,当某个地方没有太多变化时,我使用控制器中的renderView函数缓存了该部分的html代码。首先尝试XDebug比安装Xhprof更容易,谢谢提示。另外,我希望在生产模式下,twig模板被编译成php文件,感谢您的确认。我用XDebug profiler做了一些实验,但twig_Template::getAttribute似乎不是瓶颈。我会看看是否有时间和大家分享我的经验。仅供参考。这是为Twigg 1.x准备的。Fabien没有完成将它移植到Twig2的工作,因为它没有带来太多的改进。真正的解决方案是:不要渲染6000个条目。但是:你试过吗?()