为什么Symfony2在基准testing中performance如此糟糕,这有什么关系?

我和我的同事正在select一个Web框架来开发一个高stream量的网站。 我们真的很擅长node.js + expressphp + symfony2 。 两者都是很好的框架,但是我们对Symfony2有点担心,因为它似乎超过了大多数Web框架。

以下是certificate它的基准: http : //www.techempower.com/benchmarks/

由于这个原因,我们可能会使用node.js + express,但是我仍然想知道为什么Symfony2在基准testing中performance如此糟糕。

最后,这一切都归结为正确的caching处理

symfony或PHP一般比其他语言或框架慢,从而为您提供工具来创build丰富,安全和可testing的Web应用程序非常快。

如果您使用像VarnishESI (边缘端包括)的反向代理服务器,并最终为您的模板部分提供服务,您确实需要通过symfony进行更新。 你将有一个非常快的经验。

此外,如果您使用像APC这样的操作码caching和优化的数据库,那么人类用户实际上并不会注意到真实世界应用程序中几ms的差异。

根据要求,我会深入一点,给你更多的想法。


[ caching和性能 ]

云服务(s3,ec2,gae,…)几乎没有任何成本与负载平衡器配对,易于configuration(厨师,傀儡,…)和所有这些时髦的东西avilable它变得容易和负担得起的,即使小公司运行和pipe理大数据和/或高stream量的应用程序。

更多的存储意味着更多的caching空间 – 更多的计算能力意味着更快速的caching温暖。

如果人们正在谈论php或者框架性能的话你会经常听到的东西:

  • Facebook运行与PHP
  • youp ** n是用symfony开发的

那么为什么这些网站不完全崩溃? 因为他们的caching例程很聪明。

你知道例如,如果你写了一个状态更新,Facebook做了什么?

它不会将其正确保存到数据库表中,并且您的所有状态都会更新,并且如果有朋友访问了他的stream,则所有朋友的所有状态都将从数据库中提取,然后才能被提供。

Facebook将您的状态写入所有朋友新闻stream,并开始升温caching。

现在所有的stream都准备好服务,并且每当你的一个朋友访问他的stream时,他将被送达一个caching版本……几乎不涉及代码执行。

只有在cachingwarmimg完成后,该stream才会显示新创build的状态。 我们在这里谈论MS

这告诉我们什么? 在现代高度频繁的应用程序中,几乎所有内容都从caching中提供,用户不会注意到页面的实际计算花费了1ms或5秒。

在“真实世界”的情况下,最终用户会注意到框架之间的请求/秒没有差异。

即使像微caching这样的简单的东西,你可以让你的虚拟主机托pipe的博客不会立即下降,一旦你在黑客新闻的着陆页上。

最后,更重要的是…我的框架是否提供了工具,文档和教程以及示例…让整个事情变得简单快捷。 symfony为我做!

如果你被卡住了,有多less人愿意并能够回答你的performance相关的问题? 在这个框架下,有多less实际应用程序已经或将要在不久的将来创build?

你通过select一个框架来select一个社区!

…没关系,这是否重要的​​一部分…现在回到这些基准:)


[ 基准和设置 ]

在基准testing中的所有这些shiny的颜色和花哨的图表中,您很容易忽略这样一个事实,即只有一个设置(networking服务器,数据库,…)使用这些框架进行testing,而对于每个框架都可以有各种各样的configuration。

例如:而不是使用symfony2 + doctrineORM + mysql,你也可以使用symfony + doctrineODM + MongoDB。

MySQL … MongoDB …关系型数据库… NoSQL数据库… ORM …微型ORMs …原始SQL …所有这些configuration都混合在一起——>苹果和桔子。


[ 基准和优化 ]

在几乎所有的基准testing中都存在一个共同的问题 – 即使只是比较php框架 – 在networking上发现,而且“TechEmpower Web Framework基准testing”也是不平等的优化

这些基准没有利用可能的(以及有经验的开发者众所周知的)对这些框架的优化…至less对于symfony2和它们的testing来说这是事实。

关于最新testing中使用的symfony2设置的几个例子:

  • 没有使用-o标志调用“composer php安装”来转储优化的类映射自动加载器( 代码 )
  • Symfony2将不使用APCcaching进行Doctrine元数据注释,而不使用apc_cli = 1( issue )
  • 整个DI容器注入控制器,而不是只有less数必要的服务
  • 因此使用setter注入 – >创build对象,然后调用setContainer()方法,而不是直接将容器注入到构造函数中(请参阅: BenchController extends Controller扩展ContainerAware )
  • 使用别名($ this-> get('service_name'))从容器中检索服务,而不是直接访问它($ this-> container-> get('service_name'))。 ( 编码 )

名单继续…但我想你明白这是领先的。 现在有90个问题已经公开 ……一个无尽的故事。


[ 发展及资源 ]

像服务器和存储资源便宜。 真的很便宜…相比,开发时间。

我是一名自由职业者,收取相当常见的费用。 你可以得到2-3天的时间……或者是一个计算能力和存储的负载!

在select一个框架的时候,你也select了一个快速开发的工具包 – 这是一个武器,用来对付那些从来没有完全满意的,function不断变化的客户……谁愿意为你付出代价。

作为一个机构(或自由职业者),您希望在短时间内构buildfunction丰富的应用程序。 你会遇到困难的地方,也许是性能相关的问题。 但是你正面临开发成本和时间。

什么会更贵? 一个额外的服务器或额外的开发者?

这个博客回答你的问题的第二部分: http : //symfony.com/blog/is-symfony-too-slow-for-real-world-usage

因为“hello,world”testing的速度不如FooBar框架的速度,所以忽略symfony是一个错误。 原始速度不是专业人员的关键因素。 成本是关键因素。 使用symfony开发,托pipe和维护应用程序的成本比其他解决scheme的成本要低。

在select框架时,应该考虑总体开发成本。 这意味着要查看框架的代码质量(unit testing,文档等),性能(和托pipe成本),开箱即用的function的数量和质量,社区的大小,组织的使用情况像你的,可扩展性等

作为一名Symfony开发人员,我从技术angular度热切地讨厌WordPress。 但我仍然会推荐(甚至使用!)它为一个简单的网站。 不仅仅是因为它受欢迎,而且还因为它的社区规模:聘请WordPressdevise师/开发者非常容易。 看看WordPress和Symfony之间的性能比较在这种情况下是没有任何意义的。