男人不能快,但程序一定要快。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. Layui + 微信小程序 + PC端 + GatewayWorker + 移动端即时聊天系统

  2. rsyslog使用简介

    1 把日志打到新的日志文件里面 #### RULES ####ruleset(name="remote"){ action(type="omfile" file ...

  3. javaSE集合---进度2

    一.集合框架 1.特点 对象封装数据,对象多了也需要存储,集合用于存储对象. 对象的个数确定可以使用数组,但是不确定的话,可以用集合,因为集合是可变长度的. 2.集合和数组的区别 数组是固定长度的,集 ...

  4. 配置 阿里云ECS Ubuntu 16.04 64bit 桌面环境

    1. 步骤 安装软件 修改root权限 重启 2. 详情 1. 安装软件 创建脚本文件(例如:desktopSetting.sh),并输入以下内容: #!/bin/bash #更新软件库 apt-ge ...

  5. Flutter移动电商实战 --(50)持久化_shared_preferences

    当app关掉了.再进去的时候 ,购物车的内容还是存在. sqflite提供这个来操作SQLite数据库 flutter提供三种持久化的工具 今天要学的就是 shared_preferences 还有一 ...

  6. linux设置su和sudo为不需要密码

    一 设置sudo为不需要密码   有时候我们只需要执行一条root权限的命令也要su到root,是不是有些不方便?这时可以用sudo代替.默认新建的用户不在sudo组,需要编辑/etc/sudoers ...

  7. KA,连接池居然这么简单? 原创: 58沈剑 架构师之路 3月20日

    KA,连接池居然这么简单? 原创: 58沈剑 架构师之路 3月20日

  8. mysql占用服务器cpu过高的原因以及解决办法

    登陆Mysql: mysql -p<port> -u<user> -p<pwd> mysql> show processlist; show processl ...

  9. IfcWallStandardCase

    ENTITY IfcWallStandardCase SUBTYPE OF (IfcWall); WHERE HasMaterialLayerSetUsage : SIZEOF (QUERY(temp ...

  10. question——缓存清理、更新

    突然理解了各大电信公司客服说的最多的一句话“您提交的申请将会在**小时之后生效,建议您到时登陆查看”. 分析之后,我认为这里面大多的原因在于: 1.定时任务: 2.缓存有效期. 可见这么庞大的公司,目 ...