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中的字符串函数
Nov 24 PHP
php 代码优化的42条建议 推荐
Sep 25 PHP
PHP读取txt文件的内容并赋值给数组的代码
Nov 03 PHP
那些年一起学习的PHP(一)
Mar 21 PHP
php获取文件夹路径内的图片以及分页显示示例
Mar 11 PHP
Thinkphp实现MySQL读写分离操作示例
Jun 25 PHP
PHP实现图片上传并压缩
Dec 22 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
Dec 22 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
Oct 12 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 PHP
PHP架构及原理知识点详解
Dec 22 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/01/02 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
php文本转图片自动换行的方法
2013/03/13 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
ThinkPHP中where()使用方法详解
2016/04/19 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
utf8的编码算法 转载
2006/12/27 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
如何动态加载外部Javascript文件
2015/12/02 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
Augularjs-起步详解
2016/07/08 Javascript
AngularJS 模块详解及简单实例
2016/07/28 Javascript
Python itertools模块详解
2015/05/09 Python
python查找指定具有相同内容文件的方法
2015/06/28 Python
Python简单实现安全开关文件的两种方式
2016/09/19 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
2019/09/20 Python
Tensorflow累加的实现案例
2020/02/05 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
html5录音功能实战示例
2019/03/25 HTML / CSS
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
创建无烟单位实施方案
2014/03/29 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
校园安全演讲稿
2014/05/09 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
污水处理保证书
2015/05/09 职场文书
给校长的建议书作文500字
2015/09/14 职场文书
2016校本研修培训心得体会
2016/01/08 职场文书