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 相关文章推荐
加速XP搜索功能堪比vista
Mar 22 PHP
PHP 数组遍历顺序理解
Sep 09 PHP
PHP Array交叉表实现代码
Aug 05 PHP
关于UEditor编辑器远程图片上传失败的解决办法
Aug 31 PHP
解析php curl_setopt 函数的相关应用及介绍
Jun 17 PHP
PHP自动识别字符集并完成转码详解
Aug 02 PHP
php利用scws实现mysql全文搜索功能的方法
Dec 25 PHP
PHP使用PDO连接ACCESS数据库
Mar 05 PHP
PHP中实现Bloom Filter算法
Mar 30 PHP
PHP中的事务使用实例
May 26 PHP
php读取XML的常见方法实例总结
Apr 25 PHP
php命名空间设计思想、用法与缺点分析
Jul 17 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发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
浅谈ThinkPHP的URL重写
2014/11/25 PHP
php获取发送给用户的header信息的方法
2015/03/16 PHP
php生成图片缩略图的方法
2015/04/07 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
jquery插件hiAlert实现网页对话框美化
2015/05/03 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
JavaScript实现弹出广告功能
2017/03/30 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
javascript匿名函数中的'return function()'作用
2018/10/15 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
Django如何实现内容缓存示例详解
2017/09/24 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
keras 读取多标签图像数据方式
2020/06/12 Python
全球立体声:World Wide Stereo
2018/09/29 全球购物
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
数控专业个人求职信范文
2014/02/05 职场文书
2014年机关工会工作总结
2014/12/19 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
全网非常详细的pytest配置文件
2022/07/15 Python