Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Symfony2中加速模板渲染?_Php_Performance_Symfony_Twig - Fatal编程技术网

Php 如何在Symfony2中加速模板渲染?

Php 如何在Symfony2中加速模板渲染?,php,performance,symfony,twig,Php,Performance,Symfony,Twig,我有一个symfony2应用程序,可以呈现大约6000个数据库实体 我优化了ORM(推进)查询,数据库请求现在非常快。剩下的是symfony控制器和细枝模板渲染引擎 有没有加快渲染速度的方法(例如切换到php模板?) 我可以从symfony profiler中获得更详细的评测信息吗 这里是一个从探查器数据摘录 编辑:我使用xDebug分析了我的代码,发现生成对象非常昂贵。在propelObjectFormatter->getAllObjectsFromRow中从数据库行创建数千个PHP对象占用

我有一个symfony2应用程序,可以呈现大约6000个数据库实体

我优化了ORM(推进)查询,数据库请求现在非常快。剩下的是symfony控制器和细枝模板渲染引擎

有没有加快渲染速度的方法(例如切换到php模板?) 我可以从symfony profiler中获得更详细的评测信息吗

这里是一个从探查器数据摘录

编辑:我使用xDebug分析了我的代码,发现生成对象非常昂贵。在
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个条目。但是:你试过吗?()