45

我和我的同事正在选择一个 Web 框架来开发一个高流量的网站。我们真的很擅长node.js + expressphp + symfony2。两者都是很棒的框架,但我们对 Symfony2 有点担心,因为它的性能似乎优于大多数 Web 框架。

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

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

4

2 回答 2

128

最后,这一切都归结为正确的缓存处理......

symfony 或 PHP 通常比其他语言或框架慢,因此为您提供了快速创建丰富、安全和可测试的 Web 应用程序的工具。

如果您使用像VarnishESI(边缘端包括)这样的反向代理并最终为您的模板部分提供服务,那么您确实需要通过 symfony 进行更新。您将获得极快的体验。

此外,如果您使用APC之类的操作码缓存和优化的数据库,人类用户实际上不会注意到实际应用程序中几毫秒的差异。

根据要求,我会更深入地研究,并给你更多的思考。


缓存与性能

借助几乎免费的云服务(s3、ec2、gae、...)与负载均衡器、易于配置(厨师、木偶...)以及所有这些时髦的东西,它变得简单且负担得起,即使对于小公司运行和管理大数据和/或高流量应用程序。

更多的存储空间意味着更多的缓存空间——更多的计算能力意味着更快的缓存预热。

如果人们在谈论 php 或框架性能,你会经常听到的事情:

  • facebook 用 php 运行
  • youp**n 是用 symfony 开发的
  • ...

那么为什么这些网站没有完全崩溃呢?因为他们的缓存程序很聪明。

Facebook

例如,如果您编写状态更新,您是否知道 Facebook 会做什么?

它不会将其保存到包含您所有状态更新的数据库表中,并且如果朋友访问他的流,则在提供服务之前,会从数据库中获取他所有朋友的所有状态。

facebook 将您的状态写入您所有朋友的新闻流并开始加热他们的缓存。现在所有的流都准备好服务了,每当你的一个朋友访问他的流时,他都会得到一个缓存版本;立即几乎不涉及代码执行。仅当缓存预热完成后,流才会显示您新创建的状态。我们在这里谈论的是 ms...

这告诉我们什么?在现代高频应用程序中,几乎所有内容都从缓存中提供,用户不会注意到页面的实际计算需要 1 毫秒或 5 秒。

在“真实世界”场景中,最终用户将注意到框架之间的请求/秒没有差异。即使使用微缓存之类的简单内容,您也可以让您的 vps 托管博客在进入hackernews 的登录页面后不会立即关闭。

最后,更重要的是……我的框架是否提供了工具、文档、教程和示例……让整​​个事情快速轻松地启动和运行。symfony 为我做!

如果你被困住了……有多少人愿意并且能够回答你与绩效相关的问题?有多少现实世界的应用程序已经或将在不久的将来使用这个框架创建?

您通过选择框架来选择社区!

...好吧,这对于重要的部分来说是这样的...现在回到这些基准:)


基准和设置

在基准测试中所有这些闪亮的颜色和精美的图表中,您很容易错过这样一个事实,即只有一个设置(网络服务器,数据库,...)使用这些框架中的每一个进行测试,而您可以为每个框架进行多种配置.

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

MySQL ... MongoDB ... 关系数据库 ... NoSQL 数据库 ... ORM ... micro ORM ... 原始 SQL ... 所有这些都混合在这些配置中 ------> 苹果和橘子。


基准与优化

在网络上发现的几乎所有基准测试(即使是仅比较 php 框架的基准测试)以及那些“TechEmpower Web 框架基准测试”的一个常见问题是不等式优化

这些基准测试没有利用这些框架上可能的(并且由经验丰富的开发人员众所周知的)优化......至少对于 symfony2 和他们的测试,这是事实。

关于他们最新测试中使用的 symfony2 设置的一些示例:

  • 没有使用 -o 标志调用“composer install”来转储优化的类映射自动加载器(代码
  • Symfony2 不会在没有 apc_cli = 1 的情况下将 APC 缓存用于 Doctrine 元数据注释(问题
  • 整个 DI 容器被注入到控制器中,而不仅仅是少数必要的服务
  • 特此使用 setter 注入 -> 创建对象然后调用 setContainer() 方法,而不是将容器直接注入构造函数(参见:BenchController extends Controller extends ContainerAware
  • 别名( $this->get('service_name') )用于从容器中检索服务,而不是直接访问它($this->container->get('service_name') )。(代码
  • ...

名单还在继续……但我想你明白这会导致什么。现在有90 个未解决的问题……一个没完没了的故事。


开发与资源

服务器和存储等资源很便宜。真的很便宜......与开发时间相比。

我是一名自由职业者,收费相当普遍。你可以得到我 2-3 天的时间……或者大量的计算能力和存储!

在选择框架时,您也在选择一个用于快速开发的工具包——这是您与永远不会完全满足、功能爬行的客户斗争的武器……他们会为他的愿望付出高昂的代价。

作为代理商(或自由职业者),您希望在短时间内构建功能丰富的应用程序。您将面临遇到困难的地方……也许是与性能相关的问题。但是您也面临着开发成本和时间。

什么会更贵?额外的服务器或额外的开发人员?

于 2013-05-22T16:35:23.507 回答
1

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

因为“hello, world”测试的速度不如 FooBar 框架那么好而放弃 symfony 是一个错误。原始速度不是专业人士的关键因素。成本是关键因素。使用 symfony 开发、托管和维护应用程序的成本低于其他解决方案的成本。

在选择框架时,应该考虑开发的总成本。这意味着查看框架的代码质量(单元测试、文档等)、性能(和托管成本)、开箱即用的功能的数量和质量、社区的规模、组织的使用情况像你的,可扩展性等。

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

于 2017-02-06T16:00:30.367 回答