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 版本:
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 的新时代已来临, 赶紧用起来!
来源: https://www.cnblogs.com/think-a-lot/p/8572661.html