PHP及Phalcon性能上的测试

快乐无极 , 2015/02/11 16:12 , 开发文档 » PHP , 评论(5) , 阅读(19241) , Via 本站原创 | |
  我很推崇Phalcon,之前说过软件站全部由Phalcon重写,访问起来自然几乎和静态页面相差无几。当然这仅是在未达到瓶颈的状态下,实际情况中使用PHP肯定比不过使用纯静态页面。但是你愿意一直用PHP不断的生成纯静态页面吗?现代网站都不再喜欢这一点了。这样的动态性不强。一个模板中只需改动几个字符的代码的事情,便要全部重新一遍纯静态,还不如直接用动态输出的好。
  很多时候人们对PHP和phalcon的性能问题有所疑惑,现在就一些性能测试说明一下。环境都是在虚拟中进行的,数据和真实环境不太一样,但是总体上能反映一些情况了。
  在静态页面和纯字符串输出PHP的比较中,我在Linux下,nginx+PHP5.4环境测试的结果是,PHP输出是纯静态性能的一半。下面是测试数据值:
url3是纯静态页面,url4为PHP动态输出,简单输出一句Hello!
http_load进行测试的数据如下:
引用

[root@localhost test]# http_load -p 100 -s 10 urls4
11422 fetches, 100 max parallel, 68532 bytes, in 10 seconds
6 mean bytes/connection
1142.2 fetches/sec, 6853.18 bytes/sec
msecs/connect: 0.0518048 mean, 3.792 max, 0.016 min
msecs/first-response: 87.0641 mean, 126.743 max, 9.138 min
HTTP response codes:
  code 200 -- 11422
[root@localhost test]# http_load -p 100 -s 10 urls3
22912 fetches, 100 max parallel, 137472 bytes, in 10 seconds
6 mean bytes/connection
2291.2 fetches/sec, 13747.2 bytes/sec
msecs/connect: 0.0540843 mean, 0.389 max, 0.016 min
msecs/first-response: 43.4581 mean, 108.281 max, 0.892 min
HTTP response codes:
  code 200 -- 22912

这种测试虽然没什么意义,但是可以说明PHP在处理静态效果上性能还算是过得去的。那么再来看看使用框架后如何。
可以肯定的是,使用框架绝对比PHP输出要低很多。到底低多少呢?我这里只作phalcon简单的MVC,然后在控制器中输出Hello。而且关闭了view渲染,即加了一句 $this->view->disable(); 。设定url为url5。测试数据如下
引用

[root@localhost test]# http_load -p 100 -s 10 urls5
3989 fetches, 100 max parallel, 23934 bytes, in 10.0016 seconds
6 mean bytes/connection
398.837 fetches/sec, 2393.02 bytes/sec
msecs/connect: 0.0524811 mean, 0.474 max, 0.013 min
msecs/first-response: 246.997 mean, 329.362 max, 54.109 min
HTTP response codes:
  code 200 -- 3989

  显然,使用了框架后,即使是这个号称最快的PHP框架后,这个结果是令人有点失望的,这就只有398次/秒的承受量,是原PHP的三分之一的性能。但是你也许不了解398这个数字,实际上这个数据已经非常可观了,一般不是巨型网站,哪能达到这种398次/秒的量级?
  性能达到原生PHP的三分之一已经相当不错了。但这只是简单的输出,根本也不能说明这个框架到底好在哪个地方。
  实际情况是,PHP的性能已经不是问题,而是在于数据库的读取性能上。现对数据库进行测试,我把url5的地址不变,但程序上建了一个model从mysql数据库里取出一个表中的一行,输出这行的ID。
引用

[root@localhost test]# http_load -p 100 -s 10 urls5
2660 fetches, 100 max parallel, 5320 bytes, in 10 seconds
2 mean bytes/connection
266 fetches/sec, 532 bytes/sec
msecs/connect: 0.057112 mean, 0.422 max, 0.014 min
msecs/first-response: 368.702 mean, 466.627 max, 63.628 min
HTTP response codes:
  code 200 -- 2660

看起来还不错,达到266次每秒。那接下来我采用volt引擎模板去输出这个ID,请性能:
引用

[root@localhost test]# http_load -p 100 -s 10 urls5
1952 fetches, 100 max parallel, 3904 bytes, in 10.0014 seconds
2 mean bytes/connection
195.173 fetches/sec, 390.345 bytes/sec
msecs/connect: 0.0539001 mean, 0.258 max, 0.014 min
msecs/first-response: 497.756 mean, 584.082 max, 66.763 min
HTTP response codes:
  code 200 -- 1952

达到195次每秒。在数据库的读取方面,比之前的398这个数字损耗了一半性能。
我们作程序的优化,就是了为这一半性能而努力,从195到398这个目标在努力。
好了,怎么样去优化呢,要知道phalcon是对数据库作了ORM,而ORM会牺牲很大性能,但phalcon是用C去写的,在上面的测试中牺牲的性能不算是很大,实际上如果比较直接用PHP 的mysql函数去读取数据库,性能上会有很大差异。这个我一时半会没有测试用例,但是之前一次测试,在一个读取和处理MYSQL数据库表比较大的环境中,对比结果是,phalcon的ORM写法和同样的原生SQL查询写法之间,性能比大概是1:3。这个结果当时让我很不相信,总以为phalcon的性能没发挥出来,但是要知道,ORM就是这样的,它会大大的损耗性能。那这是不是意味着phalcon是夸大了宣传呢?显然不是!phalcon引入了ORM,但同时推荐使用缓存来解决性能的问题,相比之下,ORM改善了编程的便捷性和程序的可维护性,加入缓存之后也能做到和原生PHP差不多的效果。下面就用上面的例子再做缓存比较。把view缓存个15秒看看效果。
为了说明问题,干脆把这个方法贴出来:(预配置了viewcache,这些配置详见官方文档了,不再啰嗦)

    public function testAction(){
        $cache_key='my-test';
        if (!$this->view->getCache()->exists($cache_key)){
            $game=MVersion::findFirst();
            $this->view->setVar('g_id', $game->g_id);
        }
        $this->view->cache(array('key'=>$cache_key,'lifetime'=>15));
    }

然后我们再去测试这个地址,地址还是url5不变,看性能:
引用

[root@localhost test]# http_load -p 100 -s 10 urls5
3922 fetches, 100 max parallel, 7844 bytes, in 10 seconds
2 mean bytes/connection
392.2 fetches/sec, 784.4 bytes/sec
msecs/connect: 0.0515186 mean, 0.349 max, 0.015 min
msecs/first-response: 251.387 mean, 347.894 max, 59.993 min
HTTP response codes:
  code 200 -- 3922


可见用了缓存之后,性能有所上升到了195至392。可见用了缓存之后,数据库连接的时间几乎都可以忽略不计了。
在大型应用中性能的差距到底是如何的呢?我们就来点大的。抱歉程序我就不贴了,我就贴出一个网站的首页,在不使用缓存和使用缓存之后性能的差距:
(urls是采用缓存的,urls2未采用任何缓存,使用原生SQL)
引用

[root@localhost test]# http_load -p 100 -s 10 urls
3780 fetches, 100 max parallel, 1.29922e+08 bytes, in 10 seconds
34371 mean bytes/connection
378 fetches/sec, 1.29922e+07 bytes/sec
msecs/connect: 0.0561712 mean, 0.348 max, 0.013 min
msecs/first-response: 259.914 mean, 500.147 max, 206.819 min
HTTP response codes:
  code 200 -- 3780
[root@localhost test]# http_load -p 100 -s 10 urls2
541 fetches, 100 max parallel, 1.48234e+07 bytes, in 10 seconds
27400 mean bytes/connection
54.1 fetches/sec, 1.48234e+06 bytes/sec
msecs/connect: 0.0715749 mean, 0.354 max, 0.014 min
msecs/first-response: 1681.48 mean, 1997.91 max, 143.386 min
HTTP response codes:
  code 200 -- 541

可以看到,非常震惊的结果,一个是378 一个 54 ,缓存与未缓存比刚好 是1:7!

结论:使用Phalcon作未连接数据库的应用,性能卓越。作连接数据库的应用,一定要使用缓存才能体验真正的性能提升。

后记:有人会说既然性能瓶颈不在框架上,那么国内外那么多框架几乎都能使用缓存什么的,岂不都差不多。YES,其实现在来说,性能确实不在于PHP不在于框架上,而是在于这个框架是否用得顺手,设计是否合理,特别是缓存的使用是否方便,是不是BUG多多,时不时出漏洞等等上……在这些方面,我觉得phalcon做得足够强大,仔细研究下它的代码会发现,它考虑的东西很大很全,虽然文档上没那么出色,但是从性能上和架构思路上是非常出色的。好好研究一番,定会有惊喜出现!
海盗湾 Email Homepage
2016/10/19 09:11
博主,你的下载站用的是伪静态还是真的静态,如果是真的静态,怎样处理下面介绍页面过期的问题。我目前还不知道怎样让phalcon缓存html模板页面,目前看来,它是实时编译模板的,访问一次,它就写一次硬盘,好费硬盘。
快乐无极 回复于 2016/10/19 14:18
下载站完全伪静态
海盗湾 Email Homepage
2016/10/09 18:35
我现发现YAF功能好简单,放弃它了,准备跟博主学Phalcon,可有QQ群??
快乐无极 回复于 2016/10/12 11:00
我也是跟着官方文档自学的,也在github看它的源码。没有QQ群。
海盗湾 Email Homepage
2016/10/08 09:59
博主,对yaf了解不??我也想选一个企业型的框架学习一下,但yaf和phalcon不知道该选择那个。要是有一个功能对比,或许会好些。
corol Email
2016/10/03 15:23
请问博主,现在用了phalcon后负载的网站流量大概多少PV。用了静态还是虚拟静态的。我也考虑是不是用这个框架还是用 Yaf 框架
海盗湾 Email Homepage
2016/05/12 17:12
博主,有时间的话,了解一下yaf,性能似乎也不错的。
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]