这篇文章是一个翻译,英文原文在 PHP framework comparison benchmarks,我的英文水平很一般,可能会有翻译不确切的地方(把握不大地方使用斜体进行了标志,并附带了英文原文),请指正,并参看原文。 Emeric.Lee 2008.10.18

为了讨论我在另一篇文章(重新审视PHP框架 CodeIgniter VS Zend)中作出的关于PHP框架性能的比较,我决定公开我所取得的详细结果。我一开始没有公开这个测试结果是因为测试不是在完全隔离的条件下进行的(独立的客户端和服务器),但是每个测试结果应该是准确的,这也是我测试的目的。

另外,我仅仅使用了‘请求数/秒’ 作为性能的衡量标准,我不认为在实际应用中还有其它的因素可以更好的衡量WEB应用程序的相应速度。

工具

测试计算机有1.8G的AMD Sempron CPU,521M 内存,运行Ubuntu Gutsy (7.10) Desktop 操作系统。

我使用 httperf 运行测试,另外也使用apachebench 进行了一些重复测试,测试结果是吻合的。

我使用CakePHP, CodeIgniter, Zend Framework 和Ruby on Rails.分别建立了一个相同的首页,而且我还是用静态HTML和过程化的PHP代码(又称为套管程序)复制实现了相同的功能,以此作为测试基准。

我决定在测试中包含数据访问,测试中应用程序从数据库中提取了4条记录并生成结果页面。

有兴趣的人可以下载测试文件,包括Mysql数据库的SQL文件。测试代码假设数据库有Root用户并且没有密码(如果你准备自己运行测试,也许需要修改相关部分代码)。

测试结果

所有的测试结果值都是‘请求数/秒( requests per second)’ ,越高越好。

  • 没有PHP代码缓存系统
    所有框架使用了ORM(对CodeIgniter 只能勉强实现),Zend Framework使用Zend_DB_Table,CodeIgniter使用ActiveRecord。

    Run 1

    Run 2

    Run 3

    Run 4

    Average

    Baseline HTML

    1327.5

    1326.5

    1328.6

    1329.1

    1327.9

    Baseline PHP

    331.6

    332.1

    331.4

    332.0

    331.8

    CakePHP

    3.6

    3.7

    3.8

    3.5

    3.7

    CodeIgniter

    21.5

    21.2

    21.7

    21.7

    21.5

    Zend Framework

    9.3

    9.1

    9.2

    9.3

    9.2

  • 使用 eAccelerator PHP 代码缓存系统
    所有框架使用了ORM(对CodeIgniter 只能勉强实现),Zend Framework使用Zend_DB_Table,CodeIgniter使用ActiveRecord。
    测试重复进行了4次,仅列出平均值

    平均值
    CakePHP 7.8
    CodeIgniter 98.2
    Zend Framework 33.4
  • 使用 APC PHP 代码缓存系统
    所有框架使用了ORM(对CodeIgniter 只能勉强实现),Zend Framework使用Zend_DB_Table,CodeIgniter使用ActiveRecord。
    测试重复进行了4次,仅列出平均值

    平均值
    CakePHP 7.3
    CodeIgniter 97.6
    Zend Framework 32.7
  • 使用 APC PHP 代码缓存系统,禁用ORM
    Zend Framework 使用 Zend_DB ,CodeIgniter禁用了ActiveRecord。我找不到在 CakePHP中禁用ORM的方法,所以我移除了它。
    测试重复进行了4次,仅列出平均值

    平均值
    CodeIgniter 106.2
    Zend Framework 42.8
  • 使用 APC PHP 代码缓存系统,没有数据库调用
    这是为了测试数据调用对总体性能的影响,我通过Controller直接向View发送了一个空的结果集,这样跳过了Model层。
    测试重复进行了4次,仅列出平均值

    平均值
    CodeIgniter 118.0
    Zend Framework 52.0
  • Ruby on Rails 比较
    我增加这个测试是为了看看PHP框架和Ruby on Rails的差距,我也利用这个机会尝试了Passenger (mod_rails) 和 Ruby Enterprise。

    平均值
    ROR with 1 Mongrel 85.7
    ROR with Passenger 88.2
    ROR with Passenger and
    Ruby Enterprise
    96.4

结论 Conclusion

在所有的测试中Codeingiter 大约是Zend Framework两倍的速度,CakePHP 要比另外两个PHP框架慢的多。我承认,考虑到我对CodeIgniter熟悉,我也许在初始化CodeIgniter的过程中进行了优化,而对两位两个框架没能进行做的类似的优化。我已经发布了测试代码,并且欢迎专家们的评论。

更新 Update

我们已经决定选择 Zend Framework,显然彻底的性能并不是选择框架是需要考虑的唯一因素。我们现在得到的测试结果已经足够我们使用,在我们现有的应用中数据库往往是瓶颈而不是PHP代码。

我们也在生产级的双核服务器(2G 内存,运行Centos 5)上做了一些测试。这一次,所有的测试在一个相同网络内的独立的客户端计算机上进行。我们使用与上述测试完全相同的文件,除了CakePHP,我们使用了最新的版本 RC2。结果如下。

  • 没有PHP代码缓存系统
    所有框架使用了ORM(对CodeIgniter 只能勉强实现),Zend Framework使用Zend_DB_Table,CodeIgniter使用ActiveRecord。
    测试重复进行了4次,仅列出平均值

    平均值
    Baseline HTML 3391.4
    Baseline PHP 1934.7
    CakePHP 15.6
    CodeIgniter 82.9
    Zend Framework 34.6
  • 使用 eAccelerator PHP 代码缓存系统
    所有框架使用了ORM(对CodeIgniter 只能勉强实现),Zend Framework使用Zend_DB_Table,CodeIgniter使用ActiveRecord。
    测试重复进行了4次,仅列出平均值

    平均值
    CakePHP 36.1
    CodeIgniter 379.5
    Zend Framework 128.9
  • 使用 Zend Platform
    所有框架使用了ORM(对CodeIgniter 只能勉强实现),Zend Framework使用Zend_DB_Table,CodeIgniter使用ActiveRecord。
    测试重复进行了4次,仅列出平均值

    平均值
    CakePHP 24.8
    CodeIgniter 254.9
    Zend Framework 83.8

这是2篇相关联的文章

这2篇文章的英文原文后面均有大量评论,建议阅读!

(202)


5 条评论

zcc · 2009/12/02 11:47 下午

作者真严谨! 上篇评论中的zend内部人员不是特尴尬?

kazaff · 2010/03/17 4:58 下午

呵呵,只接触过ZF和CI,本身就知道框架的性能有问题,只是没想到它们之间也分的如此刻苦铭心啊!

刘苏 · 2010/03/27 3:24 下午

刘苏到访,留个脚印…

发表评论

电子邮件地址不会被公开。