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 相关文章推荐
php 数组使用详解 推荐
Jun 02 PHP
用PHP实现Ftp用户的在线管理
Feb 16 PHP
解析php二分法查找数组是否包含某一元素
May 23 PHP
php错误级别的设置方法
Jun 17 PHP
Linux编译升级php的详细方法
Nov 04 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
Jul 08 PHP
php提示Failed to write session data错误的解决方法
Dec 17 PHP
php+ajax实现文章自动保存的方法
Dec 30 PHP
php获取本周星期一具体日期的方法
Apr 20 PHP
PHP测试成功的邮件发送案例
Oct 26 PHP
非常有用的9个PHP代码片段
Apr 06 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 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
用PHP制作的意见反馈表源码
2007/03/11 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
js 目录列举函数
2008/11/06 Javascript
Javascript计算时间差的函数分享
2011/07/04 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
JavaScript中的apply()方法和call()方法使用介绍
2012/07/25 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
2015/05/25 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
2017/02/09 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
2017/11/03 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
Python3写入文件常用方法实例分析
2015/05/22 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
python实现dijkstra最短路由算法
2019/01/17 Python
Flask-WTF表单的使用方法
2019/07/12 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
2020/04/10 Python
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
党员服务承诺书
2014/05/28 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
专业见习报告范文
2014/11/03 职场文书
高一军训口号
2015/12/25 职场文书
git中cherry-pick命令的使用教程
2022/06/25 Servers