php - 为什么 Symfony2 在基准测试中表现如此糟糕,这很重要吗?

标签 php symfony web benchmarking

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

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

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

最佳答案

最终归结为正确的缓存处理 ...

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

如果您使用像 这样的反向代理清漆 ESI (边缘包括)并最终提供您真正需要通过 symfony 更新的模板部分。您将拥有极快的体验。

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

根据要求,我会更深入地研究,并为您提供更多需要考虑的事情。

缓存和性能

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

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

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

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

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

    Facebook

    例如,你知道如果你写一个状态更新 facebook 会做什么吗?

    它不会将它与您的所有状态更新直接保存到数据库表中,如果一个 friend 访问他的流,他所有 friend 的所有状态都会在被提供服务之前从数据库中获取。

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

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

    在“真实世界”场景中,最终用户将注意到框架之间的 req/sec 没有差异。即使使用像微缓存这样的简单东西,一旦您在hackernews 的登录页面上创建它,您的vps 托管博客就不会立即关闭。

    最后,更重要的是……我的框架是否提供了工具、文档、教程和示例……以快速轻松地启动和运行整个过程。 symfony 对我有用!

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

    你通过选择一个框架来选择一个社区!

    ......好吧,这就是它重要的部分......现在回到这些基准:)

    基准和设置

    在基准测试中所有这些 Shiny 的颜色和花哨的图表中,您很容易错过这样一个事实,即每个框架都只测试了一个设置(网络服务器、数据库……),而您可以为每个框架提供多种配置.

    示例:除了使用 symfony2+doctrineORM+mysql,您还可以使用 symfony+doctrineODM+MongoDB。

    MySQL ... MongoDB ... 关系数据库 ... NoSQL 数据库 ... ORM ... 微型 ORM ... 原始 SQL ... 在这些配置中都混在一起------> 苹果和橘子。

    基准和优化

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

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

    关于他们最新测试中使用的 symfony2 设置的一些示例:
  • 没有使用 -o 标志调用“composer install”来转储优化的类映射自动加载器(code)
  • Symfony2 不会在没有 apc_cli = 1 ( issue )
  • 的 Doctrine 元数据注释中使用 APC 缓存
  • 将整个 DI 容器注入(inject) Controller 而不是仅注入(inject)少数必要服务
  • 特此使用 setter 注入(inject) -> 创建对象然后调用 setContainer() 方法而不是将容器直接注入(inject)构造函数(参见:BenchController extends Controller extends ContainerAware)
  • 别名( $this->get('service_name') )用于从容器中检索服务,而不是直接访问它($this->container->get('service_name') )。 ( code )
  • ...

  • 名单还在继续……但我想你明白这是领先的。 90 open issues现在......一个无尽的故事。

    发展与资源

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

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

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

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

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

    关于php - 为什么 Symfony2 在基准测试中表现如此糟糕,这很重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16696763/

    相关文章:

    php - Node.js (mysql+socket.io) 通过 Cookie 验证 PHP?

    PHP:HTTP 还是 HTTPS?

    php Symfony 3 ajax 调用不是异步的

    javascript - 我需要一个 "do not show again"按钮

    读取托管在 Google Drive 上的 csv 文件

    php - 如何删除具有最少信息集的重复行?

    php - 获取行数和回显

    Doctrine 无法产生关系

    Symfony2 Doctrine 迁移失败

    html - 将 CSS 文件设置为私有(private)?