PHP7正式版测试,性能惊艳!


Posted in PHP onDecember 08, 2015

我们今天就来看一下PHP 7正式版的算法和 wordpress 应用在其上的性能表现。

PHP7 的安装,真是非常地向下兼容,下载,解压,把之前的配置命令用上,一路回车下去,毫无违和感。为了不影响现有的环境的运行,所有专门开辟了目录 。

配置参数如下:

--prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysqli --with-pdo-mysql --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-mcrypt --enable-ftp --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --with-gettext --disable-fileinfo --enable-maintainer-zts

GCC 版本
据鸟哥建议,使用新一点的编译器, 推荐 GCC 4.8以上, 因为只有 GCC 4.8以上 PHP 才会开启 Global Register for opline and execute_data 支持, 这个会带来5%左右的性能提升。所以本实验选用的 GCC 版本为gcc version 4.8.2 20131212 (Red Hat 4.8.2-8) (GCC)。

安装好之后,做上软链接:

ln -s /usr/local/php7/bin/php /usr/bin/php7
ln -s /usr/local/php7/bin/php-config /usr/bin/php7-config 
ln -s /usr/local/php7/bin/phpize /usr/bin/php7ize
ln -s /usr/local/php7/sbin/php-fpm /usr/sbin/php7-fpm

php7 -v 看到了我们熟悉的提示:

[root@localhost test]# php7 -v
PHP 7.0.0 (cli) (built: Dec 2 2015 19:19:14) ( ZTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies

首先做的是性能评测,评测机型,首都在线云主机,4核 CPU Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz,内存4G,操作系统 Centos 6.5。

随便写了三段程序:

第一段,生成一个 60 万元素的数组,通过查找key 的方式,来确定key是否存在。

<?php
$a = array();
for($i=0;$i<600000;$i++){
  $a[$i] = $i;
}

foreach($a as $i)
{
 array_key_exists($i, $a);
}

首先是 PHP 5.3.17 版

[root@localhost test]# time php search_by_key.php 
real 0m0.389s
user 0m0.337s
sys  0m0.051s
[root@localhost test]# time php search_by_key.php 
real 0m0.378s
user 0m0.308s
sys  0m0.062s
[root@localhost test]# time php search_by_key.php 
real 0m0.378s
user 0m0.317s
sys  0m0.061s

其次是 PHP7 版

[root@localhost php7]# time php7 search_by_key.php
real 0m0.082s
user 0m0.066s
sys  0m0.014s
[root@localhost php7]# time php7 search_by_key.php
real 0m0.080s
user 0m0.058s
sys  0m0.021s
[root@localhost php7]# time php7 search_by_key.php
real 0m0.080s
user 0m0.053s
sys  0m0.026s`

这刚出手,就名不虚传,响应时间在PHP7下运行变为原来的1/4。真牛!
那我还得搞俩试试,第二段,还是上面的这个方式,不过由于速度较慢,所以变成了一个60000个元素的数组,查找值。
代码如下:
php代码:

<?php
$a = array();
for($i=0;$i<600000;$i++){
  $a[$i] = $i;
}

foreach($a as $i)
{
 array_key_exists($i, $a);
}


[root@localhost test]# time php search_by_val.php 
real 0m24.296s
user 0m24.184s
sys  0m0.025s
[root@localhost test]# time php search_by_val.php 
real 0m25.523s
user 0m25.317s
sys  0m0.026s
[root@localhost test]# time php search_by_val.php 
real 0m26.026s
user 0m25.478s
sys  0m0.092s

等待的时间,总是觉得很漫长,三次测试,花掉了75秒多。下面,PHP 7 登场了。

[root@localhost php7]# time php7 search_by_val.php
real 0m3.362s
user 0m3.323s
sys  0m0.007s
[root@localhost php7]# time php7 search_by_val.php
real 0m3.266s
user 0m3.251s
sys  0m0.004s
[root@localhost php7]# time php7 search_by_val.php
real 0m3.290s
user 0m3.275s
sys  0m0.006s

有没有!速度整整提高了将近7倍。
笔者激动的心情难以言表,顺手又整了一个比较高效的素数算法。算出2000000以内的素数的数目,这次咱们 PHP7先开始。

[root@localhost php7]# time php7 prime_v3.php 2000000
real 0m1.151s
user 0m1.129s
sys  0m0.010s
[root@localhost php7]# time php7 prime_v3.php 2000000
real 0m1.141s
user 0m1.123s
sys  0m0.011s
[root@localhost php7]# time php7 prime_v3.php 2000000
real 0m1.145s
user 0m1.128s
sys  0m0.010s`

速度稳定在 1.2 S
而 PHP 5.3 呢,这次比上一次的差距小点了,但是PHP7速度也是它的3倍到4倍之间。

[root@localhost test]# time php prime_v3.php 2000000
prime number count under 2000000 is :148933
real 0m4.425s
user 0m4.380s
sys  0m0.023s
[root@localhost test]# time php prime_v3.php 2000000
prime number count under 2000000 is :148933
real 0m4.457s
user 0m4.414s
sys  0m0.032s
[root@localhost test]# time php prime_v3.php 2000000
prime number count under 2000000 is :148933
real 0m4.464s
user 0m4.399s
sys  0m0.046s

此素数算法如下,用的是筛选法。相对是运行速度比较快的求素数算法。

<?php
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
$num = $argv[1];
$ret = array(2);
$flag = false;
for($i=3; $i<=$num; $i+=2)
{
 $flag = false;
 $sqrt = sqrt($i);
 foreach($ret as $prime)
 {
  if($i%$prime == 0)
  {
   $flag = true;
   break;
  }
  if($prime>$sqrt)
  {
   break;
  }
 }

 if(!$flag)
 {
  $ret[] = $i;
 }
}
echo (count($ret))."\n";

至此,我们基本可以说明问题。这些代码,并没有使用复杂的函数库,也没有大量的网络和IO,性能却得到了至少3倍以上的优化。这真是一个历史性的进步。而在我们过去的性能评测中,语言层面的性能,往往是忽略的,为什么这么讲呢,比如在 XHProf中,就专门有一个选项,XHPROF_FLAGS_NO_BUILTINS,用于对内置的函数或者内部函数不做分析,比如数组、日期等的函数。因为大家往往错过了这块的提升空间,当然,一般人也无法在这块提升,所以才有了 HHVM,也激发了今天的PHP 7。

一轮测试下来,激发起了笔者对PHP 7更多了解的兴趣,想看看扩展和一些常见的框架支持如何,顺手做了如下两个测试。

记得在Alpha1版本的时候,OneAPM是不能支持的,这次行不行呢?笔者拿到 OneApm_php_Agent_1.0.0.18.tar 版,顺利安装。

PHP7正式版测试,性能惊艳!

成功地识别了PHP 7的安装路径。

PHP7正式版测试,性能惊艳!

安装成功。

对于扩展,我是没有信心再测下去了,下面测两个常用的东东,一个是Wordpress,虽然网站被和谐了,但是是什么地球人都知道吧。另外一个是ThinkPHP, 这是国内使用量最广泛的PHP开发框架,绝对第一,不是之一。笔者也是TP的粉丝。

 是该夸这两个软件做得好呢?还是该夸 PHP 7的兼容做得好呢,我也不知道了,反正小编看到了初步正常。
Wordpress 后台,在PHP 7 做为 FastCGI 后端时,运行正常。

PHP7正式版测试,性能惊艳!

ThinkPHP 最新版本3.2.3 在PHP 7 下运行正常。

PHP7正式版测试,性能惊艳!

最后我们来做一个压力测试,两个wordpress,一个是基本为空的刚刚安装的版本,一个是发布了数篇文章的版本,我们针对主页进行测试。分别在PHP5.5和PHP7下进行测试,并且两者都分别打开和关闭Zend OpCache,看看响应性能是否有明显变化。
1、PHP 5.5.26 无Zend Opcache 有文章版,20个并发

PHP7正式版测试,性能惊艳!

2、PHP 5.5.26 无Zend Opcache 有文章版,10个并发

PHP7正式版测试,性能惊艳!

3、PHP 5.5.26 无Zend Opcache 无文章版,20个并发

PHP7正式版测试,性能惊艳!

4、PHP 5.5.26 无Zend Opcache 无文章版,10个并发

PHP7正式版测试,性能惊艳!

可见并发并没有对总时间造成影响,有文章相比无文章,总时长慢了6S,平均慢了20%。
下面我们打开PHP 5.5.26 的Zend OpCache。

1、PHP 5.5.26 有Zend Opcache 有文章版,20个并发

PHP7正式版测试,性能惊艳!

2、PHP 5.5.26 有Zend Opcache 有文章版,10个并发

PHP7正式版测试,性能惊艳!

3、PHP 5.5.26 有Zend Opcache 无文章版,20个并发

PHP7正式版测试,性能惊艳!

4、PHP 5.5.26 有Zend Opcache 无文章版,10个并发

PHP7正式版测试,性能惊艳!

可见,是否开启Zend OpCache,对性能影响极为明显。对有文章版有2倍以上提升,对无文章版有4倍以上提升。

下面我们来测试PHP7,同样第一次是无Zend OpCache的版本。
1、PHP 7 无Zend Opcache 有文章版,20个并发

PHP7正式版测试,性能惊艳!

2、PHP 7 无Zend Opcache 有文章版,10个并发

PHP7正式版测试,性能惊艳!

从以上数据可见,在PHP7 对比PHP5.5.26有30%左右的性能提升,再来看一下无文章版。

3、PHP7 无Zend Opcache 无文章版,20个并发

PHP7正式版测试,性能惊艳!

4、PHP 7 无Zend Opcache 无文章版,10个并发

PHP7正式版测试,性能惊艳!

无文章版对比PHP5.5.26有 60%左右的提升。下面再来看一下开启PHP7下Zend OpCache的版本。
注意PHP7的Zend OpCache 与PHP5不同,不需要专门安装扩展,只需要在php.ini中加入如下三行配置即可。
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1

1、PHP 7 有Zend Opcache 有文章版,20个并发

PHP7正式版测试,性能惊艳!

2、PHP 7 有Zend Opcache 有文章版,10个并发

PHP7正式版测试,性能惊艳!

3、PHP 7 有Zend Opcache 无文章版,20个并发

PHP7正式版测试,性能惊艳!

4、PHP 7 有Zend Opcache 无文章版,10个并发

PHP7正式版测试,性能惊艳!

太无敌了,开启Zend OpCache,有5倍以上性能提升,而对比同样开启Zend OpCache的5.5.26,也至少有3倍以上的性能提升。可以说Zend OpCache对高并发下的性能至为关键。

PHP7性能的评测就到这里,从6月份推出PHP7 alpha版以来,我们很欣喜地等来了PHP7正式版的发布。再次评测证明,PHP7,值得你的拥有,OneAPM for PHP 能够深入到所有 PHP 应用内部完成应用性能管理和监控,包括代码级别性能问题的可见性、性能瓶颈的快速识别与追溯、真实用户体验监控、服务器监控和端到端的应用性能管理。而开启了Zend OpCache 的PHP7和OneAPM,更是值得你来热烈拥有。

PHP 相关文章推荐
一个ubbcode的函数,速度很快.
Oct 09 PHP
关于Appserv无法打开localhost问题的解决方法
Oct 16 PHP
php Smarty模板生成html文档的方法
Apr 12 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
Sep 05 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
php一维二维数组键排序方法实例总结
Nov 13 PHP
Codeigniter中集成smarty和adodb的方法
Mar 04 PHP
PHP弱类型的安全问题详细总结
Sep 25 PHP
php版微信公众平台实现预约提交后发送email的方法
Sep 26 PHP
php中str_pad()函数用法分析
Mar 28 PHP
PHP实现根据数组的值进行分组的方法
Apr 20 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 PHP
学习php设计模式 php实现命令模式(command)
Dec 08 #PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 #PHP
如何使用GDB调试PHP程序
Dec 08 #PHP
PHP MPDF中文乱码的解决方式
Dec 08 #PHP
PHP使用MPDF类生成PDF的方法
Dec 08 #PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 #PHP
学习php设计模式 php实现策略模式(strategy)
Dec 07 #PHP
You might like
如何冲泡挂耳包咖啡?技巧是什么
2021/03/04 冲泡冲煮
php合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
在PHP中操作Excel实例代码
2010/04/29 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
javascript 节点排序 2
2011/01/31 Javascript
ajax读取数据后使用jqchart显示图表的方法
2015/06/10 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
JavaScript多线程详解
2015/08/12 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
Angular2 组件交互实例详解
2017/08/24 Javascript
使用vue-infinite-scroll实现无限滚动效果
2018/06/22 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
Python内置模块turtle绘图详解
2017/12/09 Python
python通过getopt模块如何获取执行的命令参数详解
2017/12/29 Python
基于python中theano库的线性回归
2018/08/31 Python
Python如何合并多个字典或映射
2020/07/24 Python
信息管理专业学生自荐信格式
2013/09/22 职场文书
网游商务专员求职信
2013/10/15 职场文书
网络事业创业计划书范文
2014/01/09 职场文书
歌唱比赛获奖感言
2014/01/21 职场文书
个人现实表现材料
2014/02/04 职场文书
优秀员工评语
2014/02/10 职场文书
《与朱元思书》的教学反思
2014/04/17 职场文书
会计学自荐信
2014/06/03 职场文书
苏州园林导游词
2015/02/03 职场文书
会计工作态度自我评价
2015/03/06 职场文书
员工福利申请报告
2015/05/15 职场文书
商业计划书范文
2019/04/24 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书