我已经使用PHP一段时间了,并且已经很好地使用了CodeIgniter,这是一个很棒的框架.我正在开始一个新的个人项目,上次我正在考虑使用什么(PHP vs ROR)我使用PHP因为我听到ROR的可扩展性问题,特别是在阅读了Twitter开发人员不得不说的内容之后.可扩展性在ROR中仍然是一个问题,还是有改进?
我想学习一门新语言,ROR似乎很有趣.PHP完成了工作,但众所周知,它的语法和组织都很难看,感觉就像一个大黑客.
为了扩展Ryan Doherty的答案......
我在日常工作(.NET/C#)中使用静态类型语言,以及Ruby作为副作用.在我今天的工作之前,我是一家为纽约时报联合服务工作的红宝石开发公司的首席程序员.在此之前,我也在PHP工作(虽然很久很久以前).
我只是这么说:我亲身经历过铁轨(更常见的是红宝石)性能问题,以及其他一些替代方案.正如瑞恩所说,你不会自动为你量身定做.找到你的瓶颈需要大量的工作和耐心.
我们从其他人甚至自己看到的绝大多数性能问题都是在我们的ORM层中处理执行速度慢的查询.我们从Rails/ActiveRecord到Rails/DataMapper,最后到Merb/DM,每次迭代都因为底层框架而变得更快.
缓存为性能带来惊人的奇迹.不幸的是,我们无法缓存我们的数据.我们的缓存最多每五分钟就会失效一次.我们网站的几乎每一位都是动态的.因此,如果您不能这样做,也许您可以从我们的经验中学习.
我们不得不认真调整我们的数据库索引,确保我们的查询没有做非常愚蠢的事情,确保我们没有执行比绝对必要的更多查询等.当我说"非常愚蠢的事情"时,我意味着1 + N查询问题......
#1 query Dog.find(:all).each do |dog| #N queries dog.owner.siblings.each do |sibling| #N queries per above N query!! sibling.pets.each do |pet| #Do something here end end end
DataMapper是处理上述问题的一种很好的方法(它没有1 + N的问题),但更好的方法是使用你的大脑并停止这样的查询:D当你需要原始性能时,大多数ORM图层不会轻易处理极其自定义的查询,因此您也可以手写它们.
我们也做了常识.我们为我们不断增长的数据库购买了一台强大的服务器,并将其移到了自己专用的盒子上.我们还不得不经常进行处理和数据导入.我们也将处理移到了自己的盒子上.我们也停止加载我们的整个怪胎堆栈只为我们的数据导入实用程序.我们只是高雅地加载了我们绝对需要的东西(从而减少了内存开销!).
如果你不能告诉...一般来说,当涉及ruby/rails/merb时,你必须向外扩展,抛出硬件问题.但最终,硬件便宜; 虽然这不是伪劣代码的借口!:d
即使有这些困难,如果我能提供帮助,我个人也永远不会在另一个框架中启动项目.我爱上了这门语言,并且每天都在不断地学习它.这是我从C#得不到的东西,尽管C#更快.
我也喜欢开源工具,开始使用该语言的低成本,低成本只是为了获得一些东西并试着看它是否可以销售,一直用一种经常可以优雅和美丽的语言工作...
最后,在选择框架时,一切都是关于你想要日复一日地生活,呼吸,吃饭和睡觉的事情.如果你喜欢微软的思维方式,那就去.NET.如果您想要开源但仍想要结构,请尝试使用Java.如果你想拥有一个动态语言并且仍然比ruby有更多的结构,请尝试python.如果你想要优雅,试试Ruby(我小子,我小子......还有许多其他优雅的语言符合要求.不要试图开始一场火焰战:D)
见鬼,试试吧!我倾向于同意上面的答案,担心早期优化并不是你应该或不应该选择框架的原因,但我不同意这是他们唯一的答案.
简而言之,是的,你必须克服困难,但语言的优雅,imho,远远超过这些缺点.
对于这部小说感到抱歉,但我一直在那里,并且遇到了性能问题.它可以克服.所以不要让你吓跑你.
RoR与许多大型网站一起使用,但与任何语言或框架一样,它需要一个良好的架构(数据库扩展,缓存,调优等)才能扩展到大量用户.
RoR有一些细微的变化,以便更容易扩展,但不要指望它会为你神奇地扩展.每个网站都有不同的扩展问题,因此您必须投入一些工作才能使其扩展.
开发能够为您的项目提供最佳成功机会的技术 - 快速开发,轻松调试,轻松部署,良好的工具,您完全了解它(除非重点是学习新语言)等.
如果你每月获得数以百万计的独立,你可以随时雇用几个人,如果你需要,可以用不同的技术重写......
......你会在缓存中耙耙(抱歉 - 忍不住!!)
首先,将Rails与Symfony,CodeIgniter或CakePHP进行比较可能更有意义,因为Ruby on Rails是一个完整的Web应用程序框架.与PHP或PHP框架相比,Rails应用程序具有小,干净和可读的优点.PHP非常适合小型个人页面(最初代表"个人主页"),而Rails是一个完整的MVC框架,可用于构建大型网站.
Ruby on Rails 没有比类似的PHP框架更大的可伸缩性问题.如果你只有适度数量的用户(10,000-100,000)在相似数量的对象上运行,那么Rails和PHP都可以很好地扩展.对于几千个用户来说,经典的单片架构就足够了.通过一些M&M(Memcached和MySQL),您还可以处理数百万个对象.M&M架构使用MySQL服务器处理写入,使用Memcached处理高读取负载.传统的存储模式,使用规范化关系表的单个SQL服务器(或者最多是SQL Master/Multiple Read Slave设置),不再适用于非常大的站点.
如果您拥有数十亿用户,如Google,Twitter和Facebook,那么分布式架构可能会更好.如果您真的想要无限制地扩展您的应用程序,请使用某种廉价商品硬件作为基础,将您的应用程序划分为一组服务,保持每个组件或服务自身可扩展(将每个组件设计为可伸缩服务),并使其适应您的应用程序的架构.然后,您将需要合适的可扩展数据存储,如NoSQL数据库和分布式哈希表(DHT),您将需要复杂的map-reduce算法来处理它们,您将不得不处理SOA,外部服务和消息传递.PHP和Rails都没有提供灵丹妙药.
使用RoR可以解决的问题是,除非您在Alexa的前100名中,否则您将不会遇到任何可扩展性问题.除非您可以挤出Phusion,Passenger或Mongrel,否则您在共享主机上的稳定性会遇到更多问题.
花一点时间来看看Twitter人们必须处理的问题,然后问问自己,你的应用程序是否需要扩展到那个级别.
然后无论如何在Rails中构建它,因为你知道它是有道理的.如果你进入Twitter级别的卷,那么你将处于考虑性能优化选项的幸福位置.至少你会用一种很好的语言来应用它们!