我拥有CodeIgniter和Cake PHP的项目经验。但是现在我需要处理一个两个都不合适的大项目。我几乎决定使用symfony 1.4(根据我客户的要求,2.0不是一个选项)。
在Symfony 1.4中,我对ORM选择:Doctrine或Propel感到困惑?我经历了几个链接。迄今为止最好的发现是 PHP ORMs: Doctrine vs. Propel
然而,所有这些比较似乎至少有两年的历史,而且世界肯定会发生很大变化。我对编码风格没有任何问题;我对所有Active Record,Criteria,DQL或其他什么都很好。对我来说,性能最重要的是编码风格。我主要关注处理大量数据时的性能,可能是来自集群数据库下多个表的数百万行。不幸的是,我现在的经验还不足以对此事做出独立决定。
任何人都可以在Symfony 1.4下了解Propel / Doctrine的性能吗?除了性能之外,还有其他值得注意的因素(编码风格除外),选择PHP ORM时应该注意哪些因素?
答案 0 :(得分:9)
tl; dr :我使用了Doctrine很长一段时间,如果我必须开始新的事情,我会选择Propel。
这是一个几乎没有好答案的常见问题。但我会告诉你我的观点。
自从第一个alpha(以及旧的symfony 0.63)以来,我一直在使用Doctrine。我们选择Doctrine而不是Propel,因为Doctrine支持PDO(PHP原生),而Propel仍在Creole上运行(不是原生的)。与PDO相比,克里奥尔语非常缓慢(当然)。
最近,Doctrine增加了魔法。我的意思是,您可以为所有内容调用getField
,findOneByField
,它会返回您想要的内容。这真的很棒,而不是必须建立自己的getter和setter。 Magic 此时非常时髦。
使用Doctrine编写查询非常简单,而不是来自Propel的痛苦标准和标准,这非常详细。我真的很喜欢Doctrine,并建议大家开始使用它而不是Propel。
然后,Propel从1.3开始切换到PDO并开始有一个很好的API来编写查询,几乎与Doctrine相同。主要区别在于,Propel会在Doctrine动态构建时生成所有 magic 事物。这是我认为的最大区别。
Propel在这段代码中没有任何魔力。它会在您构建模型时生成所有getter / setter,join等。 Doctrine在运行查询时会执行所有操作。这对于中小型项目来说没问题,但它开始变大,它将成为一个缓慢的解决方案。它也很适合调试,因为你在生成的类中找到代码,你不必从类跳转到类来找到处理这种情况的全局方法。
ORM都使用行为。我喜欢这些行为。它们在Doctrine和Propel中以不同的方式处理。 Doctrine仍然使用它的 magic 来处理它们,其中Propel从类中的行为生成所有内容(从生成的类而不是魔法类生成一个点)。
到目前为止,Doctrine中没有任何改变(为了从你提到的线程中提取一些内容),因为Doc.x(因为1.2.x分支几乎已经死了),因此它本身并不是原生的(因为sf 1.4) last release are 24/08/2010)。 Propel仍处于活跃状态,非常活跃,正如您在github上看到的那样。
我仍在使用Doctrine,但是几年后我从Propel中学到了很多东西。我在Doctrine上构建了一些个人项目。截至今天,我改变了主意,如果我必须开始一个新项目,我将使用Propel。
很少有链接: