男人不能快,但程序一定要快。PHP7到底快不快,我们拭目以待。

PHP7来一发

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

我就静静看你们装逼,不说话。

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

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

安装两个PHP版本

http://php.net/ 已经有最新PHP7的最新版本,大家可自行下载。

为了测试PHP5和PHP7(PHP6已被放弃,心疼1s)的性能,我在不同的目录安装了两个php版本。

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

PHP7:


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

PHP5:


# /usr/bin/php -v
PHP 5.6.30 (cli) (built: Jan 19 2017 22:31:39)
Copyright (c) 1997-2016 The PHP Group
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


$arr = array();
for ($i = 0; $i < 500000; $i++) {
$arr[$i] = $i;
} $tmp = array();
foreach ($arr as $i) {
if ($i % 2 == 0) {
$is_exists = array_key_exists($i, $arr);
if ($is_exists) {
array_push($tmp, $i);
}
}
}

PHP5版本测试:


time /usr/bin/php test.php
real 0m0.301s
user 0m0.239s
sys 0m0.050s
--------------------------
time /usr/bin/php test.php
real 0m0.310s
user 0m0.241s
sys 0m0.054s
--------------------------
time /usr/bin/php test.php
real 0m0.289s
user 0m0.238s
sys 0m0.050s

PHP7版本测试:


time /usr/local/php7/bin/php test.php real 0m0.087s
user 0m0.063s
sys 0m0.024s
-------------------------------------
time /usr/local/php7/bin/php test.php real 0m0.106s
user 0m0.073s
sys 0m0.033s
--------------------------------------
time /usr/local/php7/bin/php test.php real 0m0.083s
user 0m0.061s
sys 0m0.022s

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

2.php数据库操作测试

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


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

给test_user表插入一条数据:


insert into test_user (uid,name) values (1,"dada");
MariaDB [test]> select * from test_user;
+-----+------+
| uid | name |
+-----+------+
| 1 | dada |
+-----+------+

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


/usr/bin/php -m|grep pdo
pdo_mysql
pdo_sqlite /usr/local/php7/bin/php -m|grep pdo
pdo_mysql
pdo_sqlite

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

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


$host = "yourHost";
$user = "yourUser";
$pass = "yourPass";
$db = "test";
$port = 3306; try
{
$dbh = new PDO("mysql:host=$host;dbname=$db", $user, $pass);
echo "Connected<p>";
}
catch (Exception $e)
{
echo "Unable to connect: " . $e->getMessage() ."<p>";
} $sql = "select SQL_NO_CACHE * from test_user;";
$tmp = array();
for ($i=1; $i<=500000; $i++) {
$ret = $dbh->query($sql);
foreach ($ret as $row) {
$tmp['id'] = $row['id'];
$tmp['name'] = $row['name'];
}
}

PHP5测试test_db.php:


time /usr/bin/php test_db.php
real 0m48.396s
user 0m11.149s
sys 0m3.998s real 0m51.447s
user 0m11.800s
sys 0m4.395s real 0m51.517s
user 0m11.733s
sys 0m4.439s

PHP7测试test_db.php:


real 0m47.900s
user 0m9.875s
sys 0m4.130s real 0m46.977s
user 0m9.760s
sys 0m3.983s real 0m50.010s
user 0m10.268s
sys 0m4.307s

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

3.PHP框架测试

  • thinkphp

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

  • (一)框架入口测试

PHP5下的测试:


time /usr/bin/php ./public/index.php
real 0m0.036s
user 0m0.026s
sys 0m0.010s real 0m0.038s
user 0m0.026s
sys 0m0.012s real 0m0.041s
user 0m0.032s
sys 0m0.009s

PHP7下的测试:


time /usr/local/php7/bin/php ./public/index.php
real 0m0.027s
user 0m0.021s
sys 0m0.005s real 0m0.027s
user 0m0.018s
sys 0m0.009s real 0m0.025s
user 0m0.023s
sys 0m0.002s

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

  • (二)框架逻辑测试

    在框架入口复用第一步的逻辑:

<?php
namespace app\index\controller; class Index
{
public function index()
{
$arr = array();
for ($i = 0; $i < 500000; $i++) {
$arr[$i] = $i;
} $tmp = array();
foreach ($arr as $i) {
if ($i % 2 == 0) {
$is_exists = array_key_exists($i, $arr);
if ($is_exists) {
array_push($tmp, $i);
}
}
}
}
}

PHP5版本:


time /usr/bin/php ./public/index.php
real 0m0.538s
user 0m0.463s
sys 0m0.072s real 0m0.454s
user 0m0.386s
sys 0m0.065s real 0m0.387s
user 0m0.331s
sys 0m0.055s

PHP7版本:


time /usr/local/php7/bin/php ./public/index.php
real 0m0.150s
user 0m0.123s
sys 0m0.024s real 0m0.137s
user 0m0.105s
sys 0m0.031s real 0m0.123s
user 0m0.096s
sys 0m0.026s

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

  • laravel

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

  • (一) 框架入口测试

    PHP5版本:

time /usr/bin/php ./public/index.php real 0m0.104s
user 0m0.081s
sys 0m0.022s real 0m0.148s
user 0m0.122s
sys 0m0.025s real 0m0.122s
user 0m0.100s
sys 0m0.021s

PHP版本


time /usr/local/php7/bin/php ./public/index.php real 0m0.079s
user 0m0.064s
sys 0m0.015s real 0m0.081s
user 0m0.067s
sys 0m0.014s real 0m0.067s
user 0m0.054s
sys 0m0.013s

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

  • (二)框架逻辑测试

    尝试增加一点逻辑,和thinkphp一样,复用测试逻辑。

    首先修改laravel路由,直接调用UserController的index方法:

Route::get('/', 'UserController@index');

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


public function index()
{
$arr = array();
for ($i = 0; $i < 500000; $i++) {
$arr[$i] = $i;
} $tmp = array();
foreach ($arr as $i) {
if ($i % 2 == 0) {
$is_exists = array_key_exists($i, $arr);
if ($is_exists) {
array_push($tmp, $i);
}
}
}
}

PHP5版本


time /usr/bin/php ./public/index.php
real 0m0.510s
user 0m0.377s
sys 0m0.079s real 0m0.627s
user 0m0.447s
sys 0m0.091s real 0m0.519s
user 0m0.436s
sys 0m0.079s

PHP7版本


time /usr/local/php7/bin/php ./public/index.php real 0m0.201s
user 0m0.167s
sys 0m0.032s real 0m0.216s
user 0m0.174s
sys 0m0.040s real 0m0.169s
user 0m0.134s
sys 0m0.034s

PHP7性能提升了3到4倍

压力测试

1000个请求,50个并发

  • PHP5版本:

三次样本如下:



  • PHP7版本:



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

PHP7的opcache性能测试

开启opcache:




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

PHP脚本测试数据如下:

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

压力测试数据如下:

结论:

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

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

原文地址:https://www.jianshu.com/p/5baa78646a79

PHP7有没有你们说的那么牛逼的更多相关文章

  1. 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?

    为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...

  2. 我喜欢ASP.NET的MVC因为它牛逼的9大理由(转载)

    我很早就关注ASP.NET的mvc的,因为最开始是学了Java的MVC,由于工作的原因一直在做.Net开发,最近的几个新项目我采用了MVC做了,我个一直都非常喜欢.Net的MVC.我们为什么使用MVC ...

  3. 最牛逼android上的图表库MpChart(三) 条形图

    最牛逼android上的图表库MpChart三 条形图 BarChart条形图介绍 BarChart条形图实例 BarChart效果 最牛逼android上的图表库MpChart(三) 条形图 最近工 ...

  4. 最牛逼android上的图表库MpChart(二) 折线图

    最牛逼android上的图表库MpChart二 折线图 MpChart折线图介绍 MpChart折线图实例 MpChart效果 最牛逼android上的图表库MpChart(二) 折线图 最近工作中, ...

  5. 最牛逼android上的图表库MpChart(一) 介绍篇

    最牛逼android上的图表库MpChart一 介绍篇 MpChart优点 MpChart是什么 MpChart支持哪些图表 MpChart效果如何 最牛逼android上的图表库MpChart(一) ...

  6. .Net免费公开课视频+资料+源码+经典牛逼 汇总篇【持续更新】

    博主推荐一:WP8.1最经典培训教程 博主点评:经典Windows Phone8.1 Runtime API培训最经典教程,此教程由传智播客蒋坤老师录制的一整套WP8.1入门级视频教程,讲授内容非常广 ...

  7. 科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生

    科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生 黑科技,还是要提D.E.Shaw Research这个奇异的存在. 要讲这个黑科技,我们可能要扯远一点,先讲讲D.E. Shaw这个人是怎 ...

  8. cssViewer牛逼的chrome插件

    很牛逼,功能很强大.

  9. NBU是最牛逼的备份软件

    NBU是最牛逼的备份软件 TSM是IBM的备份   好好看看几个厂商 VERITAS 公司下的NBU入门级备份有BEHP的备份软件有DPIBM的是TSMCommvault也非常牛逼这都是做到了小机AI ...

随机推荐

  1. docker容器里面执行top报“TERM environment variable not set.”

    解决: [hadoop@master ~]$ docker exec -ti 6eca7d27a988 /bin/bashroot@6eca7d27a988:/# topTERM environmen ...

  2. Java Heap dump文件分析工具jhat简介

    jhat 是Java堆分析工具(Java heap Analyzes Tool). 在JDK6u7之后成为标配. 使用该命令需要有一定的Java开发经验,官方不对此工具提供技术支持和客户服务. 用法: ...

  3. wx.navigateTo和wx.redirectTo的不同

    wx.navigateTo保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面. wx.redirectTo关闭当前页面,跳转到应用内的某个页面.就是不能返回了. ...

  4. 【解决方案】SpringCloud项目优雅发版、部署

    背景 SpringCloud分布式项目,部署在多个节点上.一般的发版方式是,使用Kill -15 pid,逐一地关闭.部署.重启. 但中间涉及到一个问题,当执行kill命令时,服务虽然关闭,但Eure ...

  5. 对象转型、迭代器Iterator、Set集合、装箱与拆箱、基本数据类型与字符串的转换、TreeSet集合与对象

      包的声明与定义 需要注意的是,包的声明只能位于Java源文件的第一行. 在实际程序开发过程中,定义的类都是含有包名的: 如果没有显式地声明package语句,创建的类则处于默认包下: 在实际开发中 ...

  6. Shell中的$0、$1、$2的含义

    在 shell 中我们会见到 $0.$1.$2这样的符号,这是什么意思呢? 简单来说 $0 就是你写的shell脚本本身的名字,$1 是你给你写的shell脚本传的第一个参数,$2 是你给你写的she ...

  7. 遇到多个构造器参数时要考虑用构建器 builder 模式 JavaBean 线程安全

    effective java p9 JavaBeans模式阻止了把类做成不可变的可能,这需要程序员付出额外的努力来确保它的线程安全.

  8. gis空间分析案例_坐标文件高斯投影变换地理处理工具

    gis空间分析案例_坐标文件投影变换地理处理工具 商务科技合作:向日葵,135—4855__4328,xiexiaokui#qq.com 功能: 对文件进行投影变换 特点: 1. 地理处理工具,可以与 ...

  9. python 混入类MixIn

    写在前面 能把一件事情说的那么清楚明白,感谢廖雪峰的官方网站. 1.为什么要用混入类?(小白入门) 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能. step1: 回忆一下 ...

  10. 严重性 代码 说明 项目 文件 行 禁止显示状态错误 C1128 节数超过对象文件格式限制: 请使用 /bigobj 进行编译。

    严重性 代码 说明 项目 文件 行 禁止显示状态错误 C1128 节数超过对象文件格式限制: 请使用 /bigobj 进行编译. 默认情况下,对象文件最多可存放 65,536 (2^16) 个可寻址的 ...