php7和php5对比

 

PHP7来一发

PHP7正式发布到现在已经一年半了,刚出道就号称比旧版本快了几倍,各种开源框架或系统运行在PHP7上速度效率提高了几倍,反正不管是媒体还是开发者都在煽风点火,不,应该是赞不绝口。
我就静静看你们装逼,不说话。

一般手机系统升级我是跑最后的,因为不愿意踩坑,毕竟iOS和Android这种系统都会出现bug,何况世界上被人黑的最多的语言。

今日时机已到,看看PHP7有没有传说的那么王炸。

安装两个PHP版本

http://php.net/ 已经有最新PHP7的最新版本,大家可自行下载。
为了测试PHP5和PHP7(PHP6已被放弃,心疼1s)的性能,我在不同的目录安装了两个php版本。

安装过程就略过了,无论源码安装还是包管理工具安装,记得自己的路径即可。

PHP7:

  1.  
    # /usr/local/php7/bin/php -v
  2.  
    PHP 7.1.5 (cli) (built: May 13 2017 23:36:41) ( NTS )
  3.  
    Copyright (c) 1997-2017 The PHP Group
  4.  
    Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

PHP5:

  1.  
    # /usr/bin/php -v
  2.  
    PHP 5.6.30 (cli) (built: Jan 19 2017 22:31:39)
  3.  
    Copyright (c) 1997-2016 The PHP Group
  4.  
    Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

环境说明:为了保证最佳的测试效果,本次测试在直接在生产环境进行,更逼近真实情况。
操作系统:CentOS 7.2 64位
基础配置:1核 1GB 1Mbps
主机品牌:腾讯云

PHP7和PHP5的对决

1. 纯php脚本测试

vim test.php

  1.  
    $arr = array();
  2.  
    for ($i = 0; $i < 500000; $i++) {
  3.  
    $arr[$i] = $i;
  4.  
    }
  5.  
     
  6.  
    $tmp = array();
  7.  
    foreach ($arr as $i) {
  8.  
    if ($i % 2 == 0) {
  9.  
    $is_exists = array_key_exists($i, $arr);
  10.  
    if ($is_exists) {
  11.  
    array_push($tmp, $i);
  12.  
    }
  13.  
    }
  14.  
    }

PHP5版本测试:

  1.  
    time /usr/bin/php test.php
  2.  
    real 0m0.301s
  3.  
    user 0m0.239s
  4.  
    sys 0m0.050s
  5.  
    --------------------------
  6.  
    time /usr/bin/php test.php
  7.  
    real 0m0.310s
  8.  
    user 0m0.241s
  9.  
    sys 0m0.054s
  10.  
    --------------------------
  11.  
    time /usr/bin/php test.php
  12.  
    real 0m0.289s
  13.  
    user 0m0.238s
  14.  
    sys 0m0.050s

PHP7版本测试:

  1.  
    time /usr/local/php7/bin/php test.php
  2.  
     
  3.  
    real 0m0.087s
  4.  
    user 0m0.063s
  5.  
    sys 0m0.024s
  6.  
    -------------------------------------
  7.  
    time /usr/local/php7/bin/php test.php
  8.  
     
  9.  
    real 0m0.106s
  10.  
    user 0m0.073s
  11.  
    sys 0m0.033s
  12.  
    --------------------------------------
  13.  
    time /usr/local/php7/bin/php test.php
  14.  
     
  15.  
    real 0m0.083s
  16.  
    user 0m0.061s
  17.  
    sys 0m0.022s

通过数据可以看出来,单纯的php脚本测试,可以看出php7性能提升了3到4倍。

2.php数据库操作测试

首先我们创建一个用户表:

  1.  
    Table: test_user
  2.  
    Create Table: CREATE TABLE `test_user` (
  3.  
    `uid` int(11) NOT NULL AUTO_INCREMENT,
  4.  
    `name` char(100) NOT NULL DEFAULT '',
  5.  
    PRIMARY KEY (`uid`)
  6.  
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

给test_user表插入一条数据:

  1.  
    insert into test_user (uid,name) values (1,"dada");
  2.  
    MariaDB [test]> select * from test_user;
  3.  
    +-----+------+
  4.  
    | uid | name |
  5.  
    +-----+------+
  6.  
    | 1 | dada |
  7.  
    +-----+------+

创建数据库测试脚本test_db.php,确保你的两个PHP版本都安装了PDO扩展。

  1.  
    /usr/bin/php -m|grep pdo
  2.  
    pdo_mysql
  3.  
    pdo_sqlite
  4.  
     
  5.  
    /usr/local/php7/bin/php -m|grep pdo
  6.  
    pdo_mysql
  7.  
    pdo_sqlite

我的两个PHP版本已经安装了PDO(不要再使用php_mysql扩展,已经过时了,PHP7已经完全抛弃,mysqli也不建议使用)。

接下来我们通过PDO编写脚本,测试select执行50万次的性能对比:

  1.  
    $host = "yourHost";
  2.  
    $user = "yourUser";
  3.  
    $pass = "yourPass";
  4.  
    $db = "test";
  5.  
    $port = 3306;
  6.  
     
  7.  
    try
  8.  
    {
  9.  
    $dbh = new PDO("mysql:host=$host;dbname=$db", $user, $pass);
  10.  
    echo "Connected<p>";
  11.  
    }
  12.  
    catch (Exception $e)
  13.  
    {
  14.  
    echo "Unable to connect: " . $e->getMessage() ."<p>";
  15.  
    }
  16.  
     
  17.  
    $sql = "select SQL_NO_CACHE * from test_user;";
  18.  
    $tmp = array();
  19.  
    for ($i=1; $i<=500000; $i++) {
  20.  
    $ret = $dbh->query($sql);
  21.  
    foreach ($ret as $row) {
  22.  
    $tmp['id'] = $row['id'];
  23.  
    $tmp['name'] = $row['name'];
  24.  
    }
  25.  
    }

PHP5测试test_db.php:

  1.  
    time /usr/bin/php test_db.php
  2.  
    real 0m48.396s
  3.  
    user 0m11.149s
  4.  
    sys 0m3.998s
  5.  
     
  6.  
    real 0m51.447s
  7.  
    user 0m11.800s
  8.  
    sys 0m4.395s
  9.  
     
  10.  
    real 0m51.517s
  11.  
    user 0m11.733s
  12.  
    sys 0m4.439s
  13.  
     

PHP7测试test_db.php:

  1.  
    real 0m47.900s
  2.  
    user 0m9.875s
  3.  
    sys 0m4.130s
  4.  
     
  5.  
    real 0m46.977s
  6.  
    user 0m9.760s
  7.  
    sys 0m3.983s
  8.  
     
  9.  
    real 0m50.010s
  10.  
    user 0m10.268s
  11.  
    sys 0m4.307s

这次脚本执行了50w次查询,user执行时间PHP7执行的脚本几乎都比PHP5要少一秒!是少一秒不是一毫秒。

3.PHP框架测试

  • thinkphp

国内肯定是首选thinkphp框架,选择最新的thinkphp5。我这里直接在官网下载的thinkphp5.0.9版本。

  • (一)框架入口测试

PHP5下的测试:

  1.  
    time /usr/bin/php ./public/index.php
  2.  
    real 0m0.036s
  3.  
    user 0m0.026s
  4.  
    sys 0m0.010s
  5.  
     
  6.  
    real 0m0.038s
  7.  
    user 0m0.026s
  8.  
    sys 0m0.012s
  9.  
     
  10.  
    real 0m0.041s
  11.  
    user 0m0.032s
  12.  
    sys 0m0.009s

PHP7下的测试:

  1.  
    time /usr/local/php7/bin/php ./public/index.php
  2.  
    real 0m0.027s
  3.  
    user 0m0.021s
  4.  
    sys 0m0.005s
  5.  
     
  6.  
    real 0m0.027s
  7.  
    user 0m0.018s
  8.  
    sys 0m0.009s
  9.  
     
  10.  
    real 0m0.025s
  11.  
    user 0m0.023s
  12.  
    sys 0m0.002s

在入口测试下,可以看到PHP和PHP7没有太大的区别,但PHP7还是稍微快一点。

  • (二)框架逻辑测试
    在框架入口复用第一步的逻辑:
  1.  
    <?php
  2.  
    namespace app\index\controller;
  3.  
     
  4.  
    class Index
  5.  
    {
  6.  
    public function index()
  7.  
    {
  8.  
    $arr = array();
  9.  
    for ($i = 0; $i < 500000; $i++) {
  10.  
    $arr[$i] = $i;
  11.  
    }
  12.  
     
  13.  
    $tmp = array();
  14.  
    foreach ($arr as $i) {
  15.  
    if ($i % 2 == 0) {
  16.  
    $is_exists = array_key_exists($i, $arr);
  17.  
    if ($is_exists) {
  18.  
    array_push($tmp, $i);
  19.  
    }
  20.  
    }
  21.  
    }
  22.  
    }
  23.  
    }

PHP5版本:

  1.  
    time /usr/bin/php ./public/index.php
  2.  
    real 0m0.538s
  3.  
    user 0m0.463s
  4.  
    sys 0m0.072s
  5.  
     
  6.  
    real 0m0.454s
  7.  
    user 0m0.386s
  8.  
    sys 0m0.065s
  9.  
     
  10.  
    real 0m0.387s
  11.  
    user 0m0.331s
  12.  
    sys 0m0.055s

PHP7版本:

  1.  
    time /usr/local/php7/bin/php ./public/index.php
  2.  
    real 0m0.150s
  3.  
    user 0m0.123s
  4.  
    sys 0m0.024s
  5.  
     
  6.  
    real 0m0.137s
  7.  
    user 0m0.105s
  8.  
    sys 0m0.031s
  9.  
     
  10.  
    real 0m0.123s
  11.  
    user 0m0.096s
  12.  
    sys 0m0.026s

在thinkphp框架中使用PHP7版本,性能提升大约是PHP5版本的4倍!

  • laravel

然后我们测试下现在最火热的PHP艺术家的框架。

  • (一) 框架入口测试
    PHP5版本:
  1.  
    time /usr/bin/php ./public/index.php
  2.  
     
  3.  
    real 0m0.104s
  4.  
    user 0m0.081s
  5.  
    sys 0m0.022s
  6.  
     
  7.  
    real 0m0.148s
  8.  
    user 0m0.122s
  9.  
    sys 0m0.025s
  10.  
     
  11.  
    real 0m0.122s
  12.  
    user 0m0.100s
  13.  
    sys 0m0.021s

PHP版本

  1.  
    time /usr/local/php7/bin/php ./public/index.php
  2.  
     
  3.  
    real 0m0.079s
  4.  
    user 0m0.064s
  5.  
    sys 0m0.015s
  6.  
     
  7.  
    real 0m0.081s
  8.  
    user 0m0.067s
  9.  
    sys 0m0.014s
  10.  
     
  11.  
    real 0m0.067s
  12.  
    user 0m0.054s
  13.  
    sys 0m0.013s

我们可以看到laravel的框架入口测试中,PHP5和PHP7的表现差异不大,但即使PHP5最高快的0.081s也比PHP7版本最慢的0.067s要慢。所以PHP7还是更胜一筹。

  • (二)框架逻辑测试
    尝试增加一点逻辑,和thinkphp一样,复用测试逻辑。
    首先修改laravel路由,直接调用UserController的index方法:
Route::get('/', 'UserController@index');

在index方法中写入测试逻辑:

  1.  
    public function index()
  2.  
    {
  3.  
    $arr = array();
  4.  
    for ($i = 0; $i < 500000; $i++) {
  5.  
    $arr[$i] = $i;
  6.  
    }
  7.  
     
  8.  
    $tmp = array();
  9.  
    foreach ($arr as $i) {
  10.  
    if ($i % 2 == 0) {
  11.  
    $is_exists = array_key_exists($i, $arr);
  12.  
    if ($is_exists) {
  13.  
    array_push($tmp, $i);
  14.  
    }
  15.  
    }
  16.  
    }
  17.  
    }

PHP5版本

  1.  
    time /usr/bin/php ./public/index.php
  2.  
    real 0m0.510s
  3.  
    user 0m0.377s
  4.  
    sys 0m0.079s
  5.  
     
  6.  
    real 0m0.627s
  7.  
    user 0m0.447s
  8.  
    sys 0m0.091s
  9.  
     
  10.  
    real 0m0.519s
  11.  
    user 0m0.436s
  12.  
    sys 0m0.079s

PHP7版本

  1.  
    time /usr/local/php7/bin/php ./public/index.php
  2.  
     
  3.  
    real 0m0.201s
  4.  
    user 0m0.167s
  5.  
    sys 0m0.032s
  6.  
     
  7.  
    real 0m0.216s
  8.  
    user 0m0.174s
  9.  
    sys 0m0.040s
  10.  
     
  11.  
    real 0m0.169s
  12.  
    user 0m0.134s
  13.  
    sys 0m0.034s

PHP7性能提升了3到4倍

压力测试

1000个请求,50个并发

  • PHP5版本:

 

image.png

 

三次样本如下:

 

image.png

 

image.png

 

image.png

  • PHP7版本:

     

     

    1

 

2

 

3

 

4

通过压力测试,在PHP7版本下,可以看到单个请求时间和请求完成时间以及每个连接请求实际运行时间的平均值都耗时更少,最重要的性能指标QPS也是高于PHP5的版本。

PHP7的opcache性能测试

开启opcache:

 

image.png

 

image.png

 

image.png

 

image.png

卧槽!开启了opcache的PHP7果然是要起飞的节奏,相比未开启的PHP7性能提升了十几倍,相比PHP5提升了将进20倍!问你怕不怕!

PHP脚本测试数据如下:

 

PHP7 vs PHP5.png

 

纯php脚本测试过程,PHP7性能大约是PHP5的3到4倍。

压力测试数据如下:

 

 

PHP5 vs PHP7 vs PHP7+OPCACHE.png

结论:

本文对PHP7和PHP5进行简单对比,性能确实有3到4倍提升,无论是在php纯脚本中,还是在框架中,PHP7高性能的表现都是一致的。

PHP7很快,PHP7+OpCache飞快,PHP7确实牛逼,PHP的新时代已来临,赶紧用起来!

posted @ 2019-04-11 19:56  科技蛋蛋  阅读(864)  评论(0)    收藏  举报